描述
输入两个整数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]=numif flag:if jtag:j+=1if j>=m-1 or M[i][j]:jtag=Falseflag=Falseif M[i][j]:j-=1if itag:i+=1else:i-=1else:j-=1if j<=0 or M[i][j]:jtag=Trueflag=Falseif M[i][j]:j+=1if itag:i+=1else:i-=1else:if itag:i+=1if i>=n-1 or M[i][j]:itag=Falseflag=Trueif M[i][j]:i-=1if jtag:j+=1else:j-=1else:i-=1if i<=0 or M[i][j]:itag=Trueflag=Trueif M[i][j]:i+=1if jtag:j+=1else: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, njelse:# 如果不能移动到下一个位置,改变方向direction_index = (direction_index + 1) % 4i, j = i + directions[direction_index][0], j + directions[direction_index][1]return Mdef 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)