1 条题解
-
0
📝 题目大意
给定一个 的 01 矩阵,将矩阵最外圈(第 1 行、第 行、第 1 列、第 列)上的数字整体顺时针移动一格,其余内部数字保持不变,输出移动后的矩阵。
💡 解题思路
-
题目分析:,数据范围很小,可以直接模拟。外圈共有 个格子,只需要按顺时针顺序收集这些格子上的值,整体右移一位再写回即可。
-
算法推导:
- 提取外圈:按顺时针顺序收集外圈元素。从左上角 出发:
- 上边:
A[0][j], 从 到 (不含右上角) - 右边:
A[i][N-1], 从 到 (不含右下角) - 下边:
A[N-1][j], 从 到 (不含左下角) - 左边:
A[i][0], 从 到 (不含左上角)
- 上边:
- 顺时针移动:将
border数组整体右移一位,即border[i] = border[i-1]( 从末尾向前),最后把原末尾元素放到border[0]。 - 写回矩阵:按照与提取相同的顺序,将
border中的值依次写回原矩阵外圈对应位置。
- 提取外圈:按顺时针顺序收集外圈元素。从左上角 出发:
-
边界与细节:
- 当 时,外圈恰好是全部 4 个格子,算法依然正确。
- 注意提取时四个角各只算一次,顺序为:左上 → 右上 → 右下 → 左下(不重复),共 个元素。
- 输入是字符串形式,每个字符是
'0'或'1',直接按字符处理即可。
⏱️ 复杂度分析
- 时间复杂度:,遍历外圈 个元素各两次(一次提取、一次写回)。
- 空间复杂度:,
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
- 上传者