# Spiral Matrix
[leetcode網址](https://leetcode.com/problems/spiral-matrix/description/)
## Idea
分成四個case,keep四個方向: `top`, `down`, `right`, `left`,然後需要兩個位移動的index: `i`走x軸,`j`走y軸
1. 往右走
- 要bound住右邊
- 走完後j=right(要往下走的column), i++(到下一層), right--(右邊bound減一)
- code
```cpp
while(j<right){
results.push_back(matrix[i][j]);
j++;
}
j=right-1;
right--;
i++;
```
2. 往下走
- 要bound住下界
- 走完後i=down(要往左走的row), j--(column往回走), down--(下界bound減一)
- code
```cpp
while(i<down){
results.push_back(matrix[i][j]);
i++;
}
i=down-1;
down--;
j--;
```
3. 往左走
- 要bound住左邊
- 走完後j=left(要往上走的column), i--(到上一層), left++(左邊bound加一)
- code
```cpp
while(j>=left){
results.push_back(matrix[i][j]);
j--;
}
j=left;
left++;
i--;
```
4. 往上走
- 要bound住上邊
- 走完後i=top(要往又走的row), j++(column往右走), top++(上邊bound加一)
- code
```cpp
while(i>top){
results.push_back(matrix[i][j]);
i--;
}
top++;
j++;
i=top;
```
## Solution
:timer_clock: Time Complexity: O (m × n)
✶⋆.˚ Space Complexity: O(1) additional space.
```cpp
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m=matrix.size(), n=matrix[0].size();
int top=0, down=m, left=0, right=n;
int dir=0, i=top, j=0;
vector<int>results;
while(results.size()<m*n){
dir%=4;
switch(dir){
case 0:
while(j<right){
results.push_back(matrix[i][j]);
j++;
}
j=right-1;
right--;
i++;
break;
case 1:
while(i<down){
results.push_back(matrix[i][j]);
i++;
}
i=down-1;
down--;
j--;
break;
case 2:
while(j>=left){
results.push_back(matrix[i][j]);
j--;
}
j=left;
left++;
i--;
break;
default:
while(i>top){
results.push_back(matrix[i][j]);
i--;
}
top++;
j++;
i=top;
break;
}
dir++;
}
return results;
}
```