回形取数

题目描述

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转
90
90度。一开始位于矩阵左上角,方向向下。

萌新: 头发不秃,编码不止!

dir = [(1, 0), (0, 1), (-1, 0), (0, -1)]  #4个方向
m, n = map(int, input().split())
a = []
for i in range(m):
a.append(input().split())
x, y = -1, 0
d = 0
sum = 0
while sum < m*n:
sum = sum + 1
nx, ny = x + dir[d][0], y + dir[d][1]
if nx < 0 or nx >= m or ny < 0 or ny >= n or a[nx][ny]==-1:
d = (d + 1) % 4
x, y = x + dir[d][0], y + dir[d][1]
else:
x, y = nx, ny
print(a[x][y], end=' ')
a[x][y] = -1 #标记这个坐标点已经取过

对代码的解释

初始化方向数组

dir = [(1, 0), (0, 1), (-1, 0), (0, -1)]  # 4个方向

这里定义了一个方向数组,表示右、下、左、上四个方向。

输入矩阵的行数和列数

m, n = map(int, input().split())

输入矩阵的元素

a = []
for i in range(m):
a.append(input().split())

初始化位置和方向

x, y = -1, 0
d = 0
sum=0

初始化当前的位置为(-1, 0)(准备开始从(0, 0)开始遍历),方向为0(即向右),和sum为0(表示已经访问的元素数量)。

开始螺旋遍历

while sum < m*n:
sum = sum + 1
nx, ny = x + dir[d][0], y + dir[d][1]
if nx < 0 or nx >= m or ny < 0 or ny >= n or a[nx][ny]==-1:
d = (d + 1) % 4
x, y = x + dir[d][0], y + dir[d][1]
else:
x, y = nx, ny
print(a[x][y], end=' ')
a[x][y] = -1

在这个循环中:

  • 我们首先计算下一个要访问的位置(nx, ny)。
  • 接着我们检查这个新的位置是否在矩阵的边界内,和是否已经被访问过(用-1标记)。如果这些条件中的任何一个不满足,我们就改变方向(向右、向下、向左、向上,依此循环),然后更新当前的位置。
  • 如果新的位置是合法的,我们就更新当前位置为新的位置。
  • 接着我们打印当前位置的元素,并标记该位置已被访问过(用-1标记)。
    通过这样的循环,我们能够按照回形路径遍历整个矩阵。