top1编程
← 返回题目
题解

右拐角方阵

1 条题解

  • 0
    @ 2026-8-5 14:24:32

    解题思路

    这道题不用真的开一个二维数组,只要找到每个格子应该写 0 还是 1 的规律,就能直接输出。

    1. “拐角”是什么意思?

    想象把方阵从左上角开始,一层一层往里圈。第 1 层是左上角那一个格子(最小的拐角),第 2 层是它外面围成的“L”形(2 行 2 列那一片),第 3 层再往外一圈……就像切洋葱一样。

    2. 每个格子属于第几层?

    位于第 i 行第 j 列的格子,属于第 max(i,j) 层。为什么?因为格子越往右下角走,它离左上角就越远。比如第 3 行第 2 列,max(3,2)=3,它就在第 3 层。

    3. 男生女生怎么交替?

    题目说:最小的拐角(第 1 层)一定是男生(0),然后 0、1、0、1 交替。所以:

    • 第 1、3、5……层(奇数层)输出 0;
    • 第 2、4、6……层(偶数层)输出 1。

    也就是看 max(i,j) 是奇数还是偶数。

    4. 对照样例

    当 n=4 时:

    0 1 0 1
    1 1 0 1
    0 0 0 1
    1 1 1 1
    

    第 1 层只有 (1,1) 是 0;第 2 层是第 1 行第 2 列、第 2 行的格子,全是 1;第 3 层全是 0;第 4 层(最外圈)全是 1。和我们的规律完全一致!

    参考代码

    #include <iostream>
    using namespace std;
    int main(){
        // P4521 右拐角方阵:按“拐角层”交替输出 0/1,最小拐角(第1层)是男生0
        int n;
        cin >> n;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                int layer = (i > j ? i : j); // 取 i,j 中较大的数,就是所在的拐角层
                cout << (layer%2==1 ? 0 : 1); // 奇数层输出0(男生),偶数层输出1(女生)
                if(j<n) cout << " ";         // 两个数字之间用空格隔开
            }
            cout << endl;                     // 每行结束换行
        }
        return 0;
    }
    

    复杂度分析

    方阵一共有 n 行 n 列,也就是 n² 个格子。我们对每个格子只做一次判断并输出,所以时间复杂度是 O(n²)。题目说 3<n<20,n 最大是 19,最多 19×19=361 个格子,瞬间就能算完。

    程序没有开数组,只用了一个变量存 n 和每个格子的层数,空间复杂度是 O(1)。

    • 1