问题描述:给定一个奇数n,将1~n * n填入n * n的矩阵中,数字不能重复,使得横竖斜的总和相等。
如当n=7时:
30 39 48 01 10 19 28
38 47 07 09 18 27 29
46 06 08 17 26 35 37
05 14 16 25 34 36 45
13 15 24 33 42 44 04
21 23 32 41 43 03 12
22 31 40 49 02 11 20
规律:从小到大依次放入矩阵中,下一个数放在上一个数的右上角位置(即:行-1,列+1)。1总是在第一行的中间位置,接着将2放在1的右上角,依次类推。 a.如果右上角的位置的行和列都越界,就将这个数放在上个数的正下方(即:上个数的行+1)。b.如果右上角的位置只有行越界,就将行改到最大,列不变。c.如果右上角的位置只有列越界,就将列改到最小,行不变。d.如果右上角的位置没有越界,但是已经填有数字,就将这个数放在上个数的正下方。
- python代码
n = int(input("请输入一个奇数:"))
m = [[0 for i in range(n)] for i in range(n)] #矩阵
row, col = 0, n // 2
num = 1
while num <= n * n:
m[row][col] = num
num += 1
row -= 1
col += 1
if row < 0 and col >= n:
row, col = row + 2, col - 1#因为row已经减了1,col已经加了1
elif row < 0:
row = n - 1
elif col >= n:
col = 0
elif m[row][col] != 0:
row, col = row + 2, col - 1
for i in range(n):
for j in range(n):
print('%02d' % m[i][j], end = ' ')
print()