# 54. 螺旋矩阵

## Link

{% embed url="<https://leetcode.cn/problems/spiral-matrix/>" %}

## Problem

给你一个 `m` 行 `n` 列的矩阵 `matrix` ，请按照 **顺时针螺旋顺序** ，返回矩阵中的所有元素。

示例 1：

{% code overflow="wrap" %}

```
输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出：[1,2,3,6,9,8,7,4,5]
```

{% endcode %}

示例2：

{% code overflow="wrap" %}

```
输入：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]
```

{% endcode %}

提示：

* m == matrix.length&#x20;
* n == matrix\[i].length&#x20;
* 1 <= m, n <= 10&#x20;
* -100 <= matrix\[i]\[j] <= 100

## Solution

{% tabs %}
{% tab title="Go" %}

```go
func spiralOrder(matrix [][]int) (ans []int) {
    l, r, t, b := 0, len(matrix[0])-1, 0, len(matrix)-1

    for {
        for i, j := t, l; j <= r; j++ {
            ans = append(ans, matrix[i][j])
        }
        if t++; t > b {break}

        for i, j := t, r; i <= b; i++ {
            ans = append(ans, matrix[i][j])
        }
        if r--; r < l {break}

        for i, j := b, r; j >= l; j-- {
            ans = append(ans, matrix[i][j])
        }
        if b--; b < t {break}

        for i, j := b, l; i >= t; i-- {
            ans = append(ans, matrix[i][j])
        }
        if l++; l > r {break}
    }

    return 
}
```

{% endtab %}

{% tab title="C++" %}

```cpp
```

{% endtab %}
{% endtabs %}
