Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
为矩阵的每个元素设置一个是否被访问的位,用于后续螺旋选择数据,变化方向。
设置x,y坐标,根据四个方向的变化,依次更新x,y,得到最终的螺旋顺序。
class Solution {
public:
vector<int> spiralOrder(vector<vector <int> >& matrix) {
vector<int> ans;
int m = matrix.size();
if( m == 0 )
return ans;
int n = matrix[0].size();
int i = 0, j = 0;
vector<vector <int> > vis(m, vector<int>(n,0));
int x = 0;
int y = 0;
int direct = 0;//0-> 1xia,2 zuo,3 shang
while(ans.size() != m*n)
{
if(vis[x][y] == 0 && direct == 0)
{
ans.push_back(matrix[x][y]);
vis[x][y] = 1;
y++;
if(y == n || vis[x][y] == 1)
{
x++;
y--;
direct = 1;
continue;
}
}
if(vis[x][y] == 0 && direct == 1)
{
ans.push_back(matrix[x][y]);
vis[x][y] = 1;
x++;
if(x == m || vis[x][y] == 1)
{
x--;
y--;
direct = 2;
continue;
}
}
if(vis[x][y] == 0 && direct == 2)
{
ans.push_back(matrix[x][y]);
vis[x][y] = 1;
y--;
if(y == -1 || vis[x][y] == 1)
{
y++;
x--;
direct = 3;
continue;
}
}
if(vis[x][y] == 0 && direct == 3)
{
ans.push_back(matrix[x][y]);
vis[x][y] = 1;
x--;
if(x == -1 || vis[x][y] == 1)
{
x++;
y++;
direct = 0;
continue;
}
}
}
return ans;
}
};