本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。
思路:就是耐心和细心的模拟题,定义一个方向变量和位置变量,然后分别针对四个方向模拟就行了.
每个方向同时也是各自的边界值
import math
num=int(input())
nums = [int(x) for x in input().split()]
nums.sort(reverse=True)
m=int(math.sqrt(num))
while num%m !=0:
m -= 1
n=num//m
if m < n:
m,n = n,m
ans = [[0 for _ in range(n)] for _ in range(m)]
up, down, left, right = 0, m - 1, 0, n - 1
i, j = 0, 0
while left <= right and up <= down:
if i == 0:
cur = left
while cur <= right:
ans[up][cur] = nums[j]
j += 1
cur += 1
up += 1
elif i == 1:
cur = up
while cur <= down:
ans[cur][right] = nums[j]
j += 1
cur += 1
right -= 1
elif i == 2:
cur = right
while cur >= left:
ans[down][cur] = nums[j]
j += 1
cur -= 1
down -= 1
else:
cur = down
while cur >= up:
ans[cur][left] = nums[j]
j += 1
cur -= 1
left += 1
i = (i + 1) % 4
for x in ans:
for y in x[:-1]:
print(y,end = " ")
print(x[-1])

316

被折叠的 条评论
为什么被折叠?



