codeforces 12e 构造题

题意:

给定一个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;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86551946