top1编程
← 返回题目
题解

蛇形方阵

1 条题解

  • 0
    @ 2026-8-5 1:11:26

    解题思路

    这个方阵是沿着反对角线一层一层填的。第 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