1050. 螺旋矩阵(25)
时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
本题要求将给定的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 76import math k=int(input()) #k为整数的个数 num =list(map(int,input().split())) if k==1: #如果只有一个数,则直接输出 print(num[0]) exit() num.sort(reverse = True) #对数据排序 num =list(map(str,num)) if math.sqrt(k)%1==0: #如果是完全2次方的数 m=int(math.sqrt(k)) else: #否则,行数等于不小于根号n的最小整数 m =int(math.sqrt(k)+1) while(k%m!=0): m+=1 n=k//m matrix=[[0 for i in range(n)] for i in range(m)] #建立m行n列的矩阵,用于存储数据 U,D,L,R=0,m-1,0,n-1 #设置上,下,左,右边界,顺时针一圈一圈的存储数据到矩阵中 i=0 j=0 x=0 while(x<k): #已经填充的数的个数应小于总个数 while(j<R and x<k): #横向上从左至右输出 matrix[i][j]=num[x] j+=1 x+=1 while(i<D and x<k): #纵向上从上往下输出 matrix[i][j]=num[x] i+=1 x+=1 while(j>L and x<k): #横向上从右至左输出 matrix[i][j]=num[x] j-=1 x+=1 while(i>U and x<k): #纵向上从下向上输出 matrix[i][j]=num[x] i-=1 x+=1 U,D,L,R=U+1,D-1,L+1,R-1 #每次从逐渐向内圈缩小 i+=1 j+=1 if x==k-1: #当到最后一个数时,特殊对待 matrix[i][j]=num[x] x+=1 for a in matrix: #输出矩阵 print(" ".join(a))