算法原理:
(1)将1填入第一行的中间;
(2)将数字下一个数填在右上方。
(i)出现越界。若越过第一行,则折返回最后一行。若越过最后一列,则折返回第一列。
(ii)没越界,但右上方已有数了,此时将其填在上一个数的正下方。
python代码:
N = int(input())
list_first =[]
list_total = []
for row in range(N): #构造二维列表,全0填充
for col in range(N):
list_first.append(0)
list_total.append(list_first)
list_first=[]
list_total[0][int(N/2)]=1 #填入 1
row_forward = 0 #刚填好的数字的行
col_forward = int(N / 2) #刚填好的数字的列
for i in range(2,N*N+1):
if row_forward -1 < 0:
row_now = N-1 #第一行 行越界
else:
row_now = row_forward -1
if col_forward +1 > N-1:
col_now = 0 #最后一列 列越界
else:
col_now = col_forward +1
if list_total[row_now][col_now] != 0: # 如果该位置不是0,则说明该位置已被填好了数字
row_now = row_forward +1
col_now = col_forward
list_total[row_now][col_now]=i
row_forward = row_now
col_forward = col_now
for row in list_total:
print(row)
运行结果: