原题链接:PTA | 程序设计类实验辅助教学平台
参考资料:
每日一题——Python实现PAT乙级1050 螺旋矩阵(举一反三+思想解读+逐步优化)6千字好文_pat 1050 python-CSDN博客
Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!
def find_min(N):
min_diff = float('inf')
m, n = 0, 0
for i in range(1, int(N**0.5) + 1):
if N % i == 0:
j = N // i #从1开始递增的i(小值,增序),j(大值)就是降序
if j >= i and j - i < min_diff:
min_diff = j - i
m, n = j, i
return m, n
def main():
N = int(input())
nums = list(map(int,input().split()))
nums.sort(reverse = True)
m, n = find_min(N)
#创建数组填充螺旋矩阵
matrix = [[0] * n for _ in range(m)]
top, bottom, left, right = 0, m-1, 0, n-1
index = 0
while top <= bottom and left <= right:
# 向右填充
for i in range(left, right + 1):
matrix[top][i] = nums[index]
index += 1
top += 1
# 向下填充
for i in range(top, bottom + 1):
matrix[i][right] = nums[index]
index += 1
right -= 1
# 向左填充
if top <= bottom:
for i in range(right, left -1, -1):
matrix[bottom][i] = nums[index]
index += 1
bottom -= 1
# 向上填充
if left <= right:
for i in range(bottom, top - 1, -1):
matrix[i][left] = nums[index]
index += 1
left += 1
for row in matrix:
print(' '.join(map(str, row)))
main()
#下面代码超时
# def main():
# N = int(input())
# ls = list(map(int,input().split()))
# if N == 1 :
# print(ls[0])
# return
# ls.sort(reverse = True)
# ls = list(map(str, ls))
# m = N ** 0.5
# m = int(m) if m == int(m) else int(m + 1)
# n = N // m
# #创建三维数组
# matrix = [[0 for j in range(n)] for i in range(m)]
# k = i = j = l = 0
# while k < N:
# while k < N and i < n-1:
# matrix[j][i] = ls[k]
# i+=1
# k+=1
# while k < N and j < m-1:
# matrix[j][i] = ls[k]
# j+=1
# k+=1
# #控制行列i和j循环检测,k顺序填入
# while k < N and i > l:
# matrix[j][i] = ls[k]
# i-=1
# k+=1
# while k < N and j > l:
# matrix[j][i] = ls[k]
# j-=1
# k+=1
# #最后一个副职判断,防止最后一个值填不上的问题
# i,j,l,m,n=i+1,j+1,l+1,m-1,n-1
# if k == n-1:
# matrix[j][i] = ls[k]
# k+=1
# for _ in matrix:
# print(" ".join(_))
# main()