top1编程
← 返回题目
题解

左拐角方阵

1 条题解

  • 0
    @ 2026-8-5 1:04:44

    解题思路

    把 n×n 的方阵想象成一层一层的“拐角”叠在一起:

    最外面那一圈“拐角”是最大的拐角,它是“最下面一行 + 最左边一列”,按题目要求最外层是男生,用 0 表示。再往里一层是女生,用 1 表示;再往里又是 0……就这样 0、1、0、1 交替出现。

    那么关键问题是:怎么知道某个格子在第几层拐角?

    看这个格子离“最下面”有多远(距离 = n - i),再看它离“最左边”有多远(距离 = j - 1)。哪边近,就说明它属于哪一层,所以取两个距离中较小的那一个,就是它所在的层数(最外层是第 0 层)。

    • 第 0 层输出 0(男生)
    • 第 1 层输出 1(女生)
    • 第 2 层又输出 0……
    • 也就是:输出 层数 % 2

    用样例 n=4 验证一下:第 1 行第 2 列的格子,离左边距离 1、离下边距离 3,取小者 1,输出 1;第 4 行任意一列,离下边距离都是 0,输出 0。和样例输出完全一样!

    参考代码

    // 左拐角方阵:最外层"拐角"(最底行+最左列)是男生0,往里一层是女生1,依次交替
    // 规律:第i行第j列的格子离最外层拐角的层数 = min(离左边距离j-1, 离下边距离n-i)
    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) {          // i是行号,从上往下1~n
            for (int j = 1; j <= n; j++) {      // j是列号,从左往右1~n
                int l = j - 1;                  // 离左边缘的距离(第0层是最左列)
                int b = n - i;                  // 离下边缘的距离(第0层是最底行)
                int d = l < b ? l : b;          // 取较小者=所在拐角层数
                if (j > 1) cout << ' ';         // 数字之间用空格隔开
                cout << (d % 2);                // 第0层是男生0,交替出现
            }
            cout << endl;
        }
        return 0;
    }
    

    复杂度分析

    方阵共有 n×n 个格子,两层循环把每个格子算一遍并输出,所以时间复杂度是 O(n²)。只用了几个 int 变量,空间复杂度是 O(1)。

    • 1