给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
思路:
// 位置向量结构体
type Pos struct{ x, y, dir, num int }
// 位置向量栈
type stack []Pos
// 入栈
func (this *stack) Push(p Pos) {
(*this) = append((*this), p)
}
// 长度
func (this stack) Size() int { return len(this) }
// 出栈
func (this *stack) Pop() Pos {
res := (*this)[this.Size()-1]
(*this) = (*this)[0 : this.Size()-1]
return res
}
// 栈顶
func (this stack) Top() Pos {
return this[this.Size()-1]
}
// 输出顺序值切片
func (this stack) getArr() []int {
n := this.Size()
ans := make([]int, n)
for i := 0; i < n; i++ {
ans[i] = this[i].num
}
return ans
}
// 像走迷宫一样来回转圈圈儿
func spiralOrder(matrix [][]int) []int {
n := len(matrix)
m := len(matrix[0])
var x, y int
var pStk stack
times := n * m
var pos = Pos{x, y, 0, matrix[x][y]}
pStk.Push(pos)
for i := 0; i < times; i++ {
pos = pStk.Top()
matrix[pos.x][pos.y] = 0x3f3f // 表示走过
for matrix[pos.x][pos.y] == 0x3f3f && pStk.Size() != times {
switch pos.dir {
case 0: // 右
x, y = pos.x, pos.y+1
case 1: // 下
x, y = pos.x+1, pos.y
case 2: // 左
x, y = pos.x, pos.y-1
case 3: // 上
x, y = pos.x-1, pos.y
}
if x >= 0 && x < n && y >= 0 && y < m && matrix[x][y] != 0x3f3f {
pos.x, pos.y, pos.num = x, y, matrix[x][y]
pStk.Push(pos)
} else {
pos.dir++
pos.dir %= 4 // 呈环形方向旋转
}
}
}
return pStk.getArr()
}