1050 螺旋矩阵 (25 分)
本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10
4
,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行 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
代码
import math
num = int(input())
figure = list(map(int, input().split()))
figure.sort(reverse=True)
shap_1 = int(math.sqrt(num))
while num % shap_1 != 0:
shap_1 = shap_1 - 1
shap_2 = num // shap_1
up, left = 0, 0
right, down = shap_1, shap_2
result = [[0 for i in range(right)] for j in range(down)]
# print(result)
k = 0
while k <= num:
for i in range(left, right):
result[up][i] = figure[k]
k += 1
up += 1
for j in range(up, down):
result[j][right - 1] = figure[k]
k += 1
right -= 1
if not k < num:
break
for m in range(right - 1, left - 1, -1):
result[down - 1][m] = figure[k]
k += 1
down -= 1
for n in range(down - 1, up - 1, -1):
result[n][left] = figure[k]
k += 1
left += 1
for i in range(len(result)):
print(" ".join(str(i) for i in result[i]))