题意:
给定一个n
构造 一个n*n矩阵使得每行都包含0~n-1所有元素且关于主对角线对称且主对角线必须全为0
题解:
先不考虑0排序。例如,如果n=10,先按下面这样排好
1 2 3 4 5 6 7 8 9 0
2 3 4 5 6 7 8 9 1 0
3 4 5 6 7 8 9 1 2 0
4 5 6 7 8 9 1 2 3 0
5 6 7 8 9 1 2 3 4 0
6 7 8 9 1 2 3 4 5 0
7 8 9 1 2 3 4 5 6 0
8 9 1 2 3 4 5 6 7 0
9 1 2 3 4 5 6 7 8 0
0 0 0 0 0 0 0 0 0 0
然后每个0都等于它当前行/列对角线的值。再把左对角线上的值归零。
结果就是:
0 2 3 4 5 6 7 8 9 1
2 0 4 5 6 7 8 9 1 3
3 4 0 6 7 8 9 1 2 5
4 5 6 0 8 9 1 2 3 7
5 6 7 8 0 1 2 3 4 9
6 7 8 9 1 0 3 4 5 2
7 8 9 1 2 3 0 5 6 4
8 9 1 2 3 4 5 0 7 6
9 1 2 3 4 5 6 7 0 8
1 3 5 7 9 2 4 6 8 0
#include <bits/stdc++.h>
int ma[1010][1010];
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i < n; i ++){
for(int j = i; j >= 1; j --){
ma[i - j + 1][j] = i;
}
}
for(int i = n - 1; i > 1; i --){
for(int j = i; j < n; j ++){
ma[n + i - j - 1][j] = i - 1;
}
}
for(int i = 1; i < n; i ++){
ma[n][i] = ma[i][n] = ma[i][i];
ma[i][i] = 0;
}
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= n; j ++){
printf("%d", ma[i][j]);
if(j != n)
printf(" ");
}
printf("\n");
}
return 0;
}