1 条题解

  • 2
    @ 2026-10-18 20:06:49

    思维,构造

    思路: 这是一道构造题,答案不唯一,任意一种合法矩阵都可以。我们用“一层一层往外包”的方式构造:

    先把矩阵最外层(第 1 行和第 1 列)全部填 0;再把里面剩下的 (n-1)×(n-1) 区域当作一个新矩阵,重复同样的操作,只不过这次填 1;再往里填 0、填 1……一直填到中心。写成公式就是:A[i][j] = 1 当且仅当 min(i, j) 为偶数(行、列都从 1 开始编号)。

    注意最外层必须从 0 开始:第一行整行都是同一种数,如果最外层填 1,第一行的和就是 n,而题目要求行和只能取 0 ~ n-1。

    以 n = 1 ~ 5 为例(每一层颜色交替,最外层都是 0):

    n=1     n=2     n=3       n=4         n=5
    0       00      000       0000        00000
            01      011       0111        01111
                    010       0100        01000
                              0101        01011
                                          01010
    

    为什么合法:

    1. 行和: 第 i 行里,j ≤ i 的格子落在第 j 层,偶数层为 1;j > i 的格子都落在第 i 层,i 为偶数时全为 1。于是奇数行 i = 2k-1 的行和是 k-1,偶数行 i = 2k 的行和是 n-k,合起来恰好是 0, 1, ..., n-1 各一次。
    2. 列和: 因为 min(i, j) = min(j, i),矩阵关于主对角线对称,所以列和与行和完全相同,同样是 0 ~ n-1 各一次。
    3. 连通块: 每一层是一个“L 形环”,环内连通;相邻两层数字相反;隔一层虽然同色,但中间隔着另一层,并不相邻。所以每一层恰好贡献一个同色连通块,n 层正好 n 个。

    复杂度: 时间复杂度 O(n²),空间复杂度 O(1)。

    代码:

    #include <stdio.h>
    int main()
    {
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= n; j++){
                int m;
                if (i < j){
                    m = i;
                }
                else{
                    m = j;
                }
                if (m % 2 == 0){
                    printf("1");
                }
                else{
                    printf("0");
                }
            }
            printf("\n");
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1241
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    69
    已通过
    23
    上传者