描述
输入两个整数n和m,输出一个n行m列的矩阵,将数字11到n×m按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入
输入共一行,包含两个整数n和m。
输出
输出满足要求的矩阵。
矩阵占n行,每行包含m个空格隔开的整数。
数据范围
1≤n,m≤100
输入样例 1
3 3
输出样例1
1 2 3
8 9 4
7 6 5
代码实现:
原始版本:
相对冗余
def print_matrix(M):
for row in M:
print(' '.join(map(str, row)))
line=input()
list=[int(i) for i in line.split()]
n,m=list[0],list[1]
M=[[0 for _ in range(m)] for _ in range(n)]
i,j=0,0
flag=True
itag,jtag=True,True
for num in range(1,n*m+1):
M[i][j]=num
if flag:
if jtag:
j+=1
if j>=m-1 or M[i][j]:
jtag=False
flag=False
if M[i][j]:
j-=1
if itag:
i+=1
else:
i-=1
else:
j-=1
if j<=0 or M[i][j]:
jtag=True
flag=False
if M[i][j]:
j+=1
if itag:
i+=1
else:
i-=1
else:
if itag:
i+=1
if i>=n-1 or M[i][j]:
itag=False
flag=True
if M[i][j]:
i-=1
if jtag:
j+=1
else:
j-=1
else:
i-=1
if i<=0 or M[i][j]:
itag=True
flag=True
if M[i][j]:
i+=1
if jtag:
j+=1
else:
j-=1
print_matrix(M)
优化代码:
相对简短
def spiral_fill(n, m):
M = [[0] * m for _ in range(n)]
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 右,下,左,上
direction_index = 0 # 初始方向为向右
i, j = 0, 0 # 初始位置
for k in range(1, n * m + 1):
M[i][j] = k
# 尝试移动到下一个位置
ni, nj = i + directions[direction_index][0], j + directions[direction_index][1]
if 0 <= ni < n and 0 <= nj < m and M[ni][nj] == 0:
i, j = ni, nj
else:
# 如果不能移动到下一个位置,改变方向
direction_index = (direction_index + 1) % 4
i, j = i + directions[direction_index][0], j + directions[direction_index][1]
return M
def print_matrix(M):
for row in M:
print(' '.join(map(str, row)))
# 读取矩阵大小
n, m = map(int, input().split())
# 填充蛇形矩阵
M = spiral_fill(n, m)
# 打印矩阵
print_matrix(M)