0885. Spiral Matrix I I I

# 885. Spiral Matrix III#

## 题目 #

On a 2 dimensional grid with `R` rows and `C` columns, we start at `(r0, c0)` facing east.

Here, the north-west corner of the grid is at the first row and column, and the south-east corner of the grid is at the last row and column.

Now, we walk in a clockwise spiral shape to visit every position in this grid.

Whenever we would move outside the boundary of the grid, we continue our walk outside the grid (but may return to the grid boundary later.)

Eventually, we reach all `R * C` spaces of the grid.

Return a list of coordinates representing the positions of the grid in the order they were visited.

Example 1:

``````Input: R = 1, C = 4, r0 = 0, c0 = 0
Output: [[0,0],[0,1],[0,2],[0,3]]
``````

Example 2:

``````Input: R = 5, C = 6, r0 = 1, c0 = 4
Output: [[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],
[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],
[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]
``````

Note:

1. `1 <= R <= 100`
2. `1 <= C <= 100`
3. `0 <= r0 < R`
4. `0 <= c0 < C`

## 解题思路 #

• 给出一个二维数组的行 `R`，列 `C`，以及这个数组中的起始点 `(r0,c0)`。从这个起始点开始出发，螺旋的访问数组中各个点，输出途径经过的每个坐标。注意每个螺旋的步长在变长，第一个螺旋是 1 步，第二个螺旋是 1 步，第三个螺旋是 2 步，第四个螺旋是 2 步……即 1，1，2，2，3，3，4，4，5……这样的步长。
• 这一题是第 59 题的加强版。除了有螺旋以外，还加入了步长的限制。步长其实是有规律的，第 0 次移动的步长是 `0/2+1`，第 1 次移动的步长是 `1/2+1`，第 n 次移动的步长是 `n/2+1`。其他的做法和第 59 题一致。

## 代码 #

``````
package leetcode

func spiralMatrixIII(R int, C int, r0 int, c0 int) [][]int {
res, round, spDir := [][]int{}, 0, [][]int{
[]int{0, 1},  // 朝右
[]int{1, 0},  // 朝下
[]int{0, -1}, // 朝左
[]int{-1, 0}, // 朝上
}
res = append(res, []int{r0, c0})
for i := 0; len(res) < R*C; i++ {
for j := 0; j < i/2+1; j++ {
r0 += spDir[round%4][0]
c0 += spDir[round%4][1]
if 0 <= r0 && r0 < R && 0 <= c0 && c0 < C {
res = append(res, []int{r0, c0})
}
}
round++
}
return res
}

``````

Apr 8, 2023