📅  最后修改于: 2023-12-03 15:06:41.156000             🧑  作者: Mango
在许多编程问题中,矩阵是一个十分基础的数据结构。这里介绍一种以螺旋形式打印给定的矩阵的算法。
这种算法的实现思路比较简单,主要分为两个步骤:
遍历矩阵。先打印矩阵的第一行,然后打印矩阵最后一列,再打印矩阵的最后一行,最后打印矩阵第一列。每个方向打印完毕之后,都将该方向上已经打印过的元素标记一下。这里建议使用一个额外的 boolean 类型的数组 visited 来记录已经打印的元素。
转向矩阵。在每个方向打印完毕之后,将方向转向下一个方向。这里我们可以用一个变量 direction 来记录当前方向,1 代表向右,2 代表向下,3 代表向左,4 代表向上。每次转向时,我们只需要将 direction 加 1,再对 4 取余即可。例如,换向的时候如果 direction 为 3(向左),那么将 direction 加 1 之后得到 4(向上),再对 4 取余得到 0(向右)。
下面给出 Python3 版本的代码实现:
def spiralOrder(matrix):
m = len(matrix)
if m == 0:
return []
n = len(matrix[0])
visited = [[False] * n for _ in range(m)]
direction, i, j = 0, 0, 0
res = []
while True:
if direction == 0:
if not visited[i][j]:
res.append(matrix[i][j])
visited[i][j] = True
if j < n - 1 and not visited[i][j+1]:
j += 1
else:
direction = (direction + 1) % 4
if i < m - 1 and not visited[i+1][j]:
i += 1
else:
break
elif direction == 1:
if not visited[i][j]:
res.append(matrix[i][j])
visited[i][j] = True
if i < m - 1 and not visited[i+1][j]:
i += 1
else:
direction = (direction + 1) % 4
if j > 0 and not visited[i][j-1]:
j -= 1
else:
break
elif direction == 2:
if not visited[i][j]:
res.append(matrix[i][j])
visited[i][j] = True
if j > 0 and not visited[i][j-1]:
j -= 1
else:
direction = (direction + 1) % 4
if i > 0 and not visited[i-1][j]:
i -= 1
else:
break
elif direction == 3:
if not visited[i][j]:
res.append(matrix[i][j])
visited[i][j] = True
if i > 0 and not visited[i-1][j]:
i -= 1
else:
direction = (direction + 1) % 4
if j < n - 1 and not visited[i][j+1]:
j += 1
else:
break
return res
这个代码片段通过一个 4*4 的测试矩阵输出结果如下:
[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
可以看到,输出的结果是一个包含所有元素的列表,并且是以螺旋形式排列的。