1 条题解
-
2
思维,构造
思路: 这是一道构造题,答案不唯一,任意一种合法矩阵都可以。我们用“一层一层往外包”的方式构造:
先把矩阵最外层(第 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为什么合法:
- 行和: 第
i行里,j ≤ i的格子落在第j层,偶数层为1;j > i的格子都落在第i层,i为偶数时全为1。于是奇数行i = 2k-1的行和是k-1,偶数行i = 2k的行和是n-k,合起来恰好是0, 1, ..., n-1各一次。 - 列和: 因为
min(i, j) = min(j, i),矩阵关于主对角线对称,所以列和与行和完全相同,同样是0 ~ n-1各一次。 - 连通块: 每一层是一个“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
- 上传者