本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。
输入样例:
12
37 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 93
42 37 81
53 20 76
58 60 76
2. 代码如下:
import math
def get_shape(N):
keys = []
values = []
for j in range(1,int(math.sqrt(N+1))+1):
for i in range(int(math.sqrt(N+1)),N+1):
if i*j == N:
d = i-j
keys.append(d)
values.append([i,j])
break
for i,key in enumerate(keys):
if key == min(keys):
m = values[i][0]
n = values[i][1]
return m,n
def get_matrix(list_ints,m,n,x,y):
if n <= 0:
return None
if n == 1:
for i in range(m):
arr[x+i][y] = list_ints.pop()
return None
#up
for i in range(n):
arr[x][y+i] = list_ints.pop()
#right
for i in range(m-1):
arr[x+1+i][y+n-1] = list_ints.pop()
#down
for i in range(n-1):
arr[x+m-1][y+n-2-i] = list_ints.pop()
#left
for i in range(m-2):
arr[x+m-2-i][y] = list_ints.pop()
get_matrix(list_ints,m-2,n-2,x+1,x+1)
if __name__ == '__main__':
N = int(input('请输入整数个数N:'))
ints = input('请输入这些整数:\n')
list_ints = ints.strip().split(' ')
list_ints = [int(i) for i in list_ints]
#list_ints由小到大排列,每次pop返回的是最大值
list_ints = sorted(list_ints)
m,n = get_shape(N)
arr = [[0 for i in range(n)] for i in range(m)]
get_matrix(list_ints,m,n,0,0)
#按要求输出
print()
for tmp in arr:
tmp = [str(i) for i in tmp]
str_tmp = ' '.join(tmp)
print(str_tmp)