#include <vector>
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
int m=matrix.size();
int n=matrix[0].size();
if (m==0) { //特殊情况处理
return res;
}
int top=0,left=0,right=n,bottom=m,max=m*n,cur=1;//定义四个边界值,同时需要遍历的次数cur计数
int row=0,col=0,begin=0;
vector<pair<int,int>> dir={{0,1},{1,0},{0,-1},{-1,0}};//定义螺旋方向 右,下,左,上
while (cur<=max) {
res.push_back(matrix[row][col]);//
int newrow=row+dir[begin].first;
int newcol=col+dir[begin].second;
if(newrow<top||newrow>=bottom||newcol<left||newcol>=right){//对下一个可能的方向进行判断
switch (begin) {//先判断再修改边界使其不断缩小
case 0:
top++;
break;
case 1:
right--;
break;
case 2:
bottom--;
break;
case 3:
left++;
break;
}
begin=(begin+1)%4;
}
//新的 行值 与 列值
cur++;
row+=dir[begin].first;
col+=dir[begin].second;
}
return res;
}
};