1 条题解

  • 0
    @ 2026-6-19 10:30:36

    📝 题目大意

    给定一个 N×NN \times N 的 01 矩阵,将矩阵最外圈(第 1 行、第 NN 行、第 1 列、第 NN 列)上的数字整体顺时针移动一格,其余内部数字保持不变,输出移动后的矩阵。

    💡 解题思路

    1. 题目分析N100N \le 100,数据范围很小,可以直接模拟。外圈共有 4N44N-4 个格子,只需要按顺时针顺序收集这些格子上的值,整体右移一位再写回即可。

    2. 算法推导

      • 提取外圈:按顺时针顺序收集外圈元素。从左上角 (0,0)(0,0) 出发:
        • 上边:A[0][j]jj00N2N-2(不含右上角)
        • 右边:A[i][N-1]ii00N2N-2(不含右下角)
        • 下边:A[N-1][j]jjN1N-111(不含左下角)
        • 左边:A[i][0]iiN1N-111(不含左上角)
      • 顺时针移动:将 border 数组整体右移一位,即 border[i] = border[i-1]ii 从末尾向前),最后把原末尾元素放到 border[0]
      • 写回矩阵:按照与提取相同的顺序,将 border 中的值依次写回原矩阵外圈对应位置。
    3. 边界与细节

      • N=2N=2 时,外圈恰好是全部 4 个格子,算法依然正确。
      • 注意提取时四个角各只算一次,顺序为:左上 → 右上 → 右下 → 左下(不重复),共 4N44N-4 个元素。
      • 输入是字符串形式,每个字符是 '0''1',直接按字符处理即可。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),遍历外圈 4N44N-4 个元素各两次(一次提取、一次写回)。
    • 空间复杂度O(N)O(N)border 数组存储外圈元素。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    int main() {
        int N;
        cin >> N;
        vector<string> A(N);
        for (int i = 0; i < N; i++) {
            cin >> A[i];
        }
    
        // 按顺时针顺序提取外圈元素(左上角开始,四个角不重复)
        vector<char> border;
        // 上边:从左到右,不含右上角
        for (int j = 0; j < N - 1; j++) {
            border.push_back(A[0][j]);
        }
        // 右边:从上到下,不含右下角
        for (int i = 0; i < N - 1; i++) {
            border.push_back(A[i][N - 1]);
        }
        // 下边:从右到左,不含左下角
        for (int j = N - 1; j > 0; j--) {
            border.push_back(A[N - 1][j]);
        }
        // 左边:从下到上,不含左上角
        for (int i = N - 1; i > 0; i--) {
            border.push_back(A[i][0]);
        }
    
        // 顺时针移动一格:整体右移一位
        char last = border.back();
        for (int i = border.size() - 1; i > 0; i--) {
            border[i] = border[i - 1];
        }
        border[0] = last;
    
        // 按相同顺序将移动后的值写回矩阵
        int idx = 0;
        for (int j = 0; j < N - 1; j++) {
            A[0][j] = border[idx++];
        }
        for (int i = 0; i < N - 1; i++) {
            A[i][N - 1] = border[idx++];
        }
        for (int j = N - 1; j > 0; j--) {
            A[N - 1][j] = border[idx++];
        }
        for (int i = N - 1; i > 0; i--) {
            A[i][0] = border[idx++];
        }
    
        // 输出结果
        for (int i = 0; i < N; i++) {
            cout << A[i] << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    724
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者