1. 问题描述:
请你构造一个 n × n 的整数矩阵。要求,矩阵满足下列所有条件:
矩阵中的所有元素的取值范围为 [0,n − 1]。
矩阵主对角线上的所有元素都为 0。主对角线是指从左上角到右下角这一斜线方向的对角线。
该矩阵是对称矩阵。对称矩阵是指以主对角线为对称轴,各元素对应相等的矩阵。
同一行上的所有元素两两不同。
同一列上的所有元素两两不同。
输入格式
一个整数 n。
输出格式
共 n 行,每行 n 个空格隔开的整数,表示整个矩阵。如果方案不唯一,输出任意合理方案均可。
数据范围
前三个测试点满足 2 ≤ n ≤ 10。
所有测试点满足 2 ≤ n ≤ 1000,n 保证是偶数。
输入样例1:
2
输出样例1:
0 1
1 0
输入样例2:
4
输出样例2:
0 1 3 2
1 0 2 3
3 2 0 1
2 3 1 0
来源:https://www.acwing.com/problem/content/4207/
2. 思路分析:
这种题目属于构造题,对于这种题目完全靠猜,思维非常具有跳跃性,一般是大胆猜想,小心论证,找一下具体的规律,对于这道题目来说我们可以考虑一下不要满足全部条件下构造一个矩阵使得满足部分条件,例如5 * 5的矩阵:
可以发现我们构造的5 * 5的矩阵除了不满足主对角线的元素之外其余的条件基本满足,我们可以令主对角线上的元素移到当前行和当前列的末尾,然后令主对角线上的元素为0即可构造一个满足要求的矩阵,实际上是先构造(n - 1) * (n - 1)的矩阵然后对对角线和最后一行,一列的元素进行调整即可完成构造,并且可以发现只有当n为偶数的时候才可以构造出满足所有要求的矩阵,当n为奇数的时候是不存在满足所有要求的矩阵。
3. 代码如下:
class Solution:
def process(self):
n = int(input())
g = [[0] * n for i in range(n)]
for i in range(n - 1):
for j in range(n - 1):
# 先生成不是对角线上的(n - 1) * (n - 1)的矩阵
g[i][j] = (i + j) % (n - 1) + 1
for i in range(n):
# 将对角线上的元素移动到最后一行与最后一列
g[0][n - 1] = g[n - 1][0] = g[i][i]
# 对角线元素置为0
g[i][i] = 0
for i in range(n):
# *[]表示将列表元素拆成多个独立的单元, 输出的列表是没有包括方括号的
print(*g[i])
if __name__ == '__main__':
print(Solution().process())