题解
蛇形方阵
1 条题解
-
0
解题思路
这个方阵是沿着反对角线一层一层填的。第
k条反对角线上的格子都满足:行号 + 列号 == k。- 当 k 是偶数时,从这条线的右上端往左下走:行号 +1、列号 -1;
- 当 k 是奇数时,从左下端往右上走:行号 -1、列号 +1。
比如 n=4,
k=2这条线上依次填 4、5、6(从右上往左下),k=3这条线依次填 7、8、9、10(从左下往右上)。填的时候注意起点的位置:线在方阵左上部分时,起点在边上;线越过中间后,起点要贴着方阵的另一条边。最后按行把整个方阵输出即可。
参考代码
// P4482 蛇形方阵:把1~N*N按反对角线一层层蛇形填入方阵 #include <iostream> using namespace std; int a[505][505]; // 存储蛇形方阵 int main() { int n; cin >> n; int num = 1; // 当前要填入的数字 // 按反对角线一层层填:第k条反对角线上的格子满足 行+列 == k for (int k = 0; k <= 2 * (n - 1); k++) { if (k % 2 == 0) { // 偶数条:从右上往左下走(行号增大、列号减小) int r = (k < n) ? 0 : k - (n - 1); // 起点行号 int c = k - r; // 起点列号 while (r < n && c >= 0) { a[r][c] = num++; r++; // 下一格行号加1 c--; // 下一格列号减1 } } else { // 奇数条:从左下往右上走(行号减小、列号增大) int r = (k < n) ? k : n - 1; // 起点行号 int c = k - r; // 起点列号 while (r >= 0 && c < n) { a[r][c] = num++; r--; // 下一格行号减1 c++; // 下一格列号加1 } } } // 输出方阵 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (j > 0) cout << " "; // 数字之间用空格隔开 cout << a[i][j]; } cout << endl; // 每行换行 } return 0; }复杂度分析
方阵一共有
n×n个格子,每个格子只填一次,所以时间复杂度 O(n²),空间用来存方阵也是 O(n²)。
- 1