Leetcode Spiral Matrix 相关代码,本方法比较简单,只是记录上下左右的偏移,并通过横向与纵向某一个方向成来结束构造,本代码使用cpp完成,并提供测试:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> >& matrix) {
// Record the four sides offset, 0: right, 1: down, 2: left, 3: up
vector<int> direction(4, 0);
vector<int> re;
if (matrix.size() == 0) {
return re;
}
// foo control the four conditions of moving
int foo = 0;
// x, y record the current positon in matrix
int x = 0;
int y = -1;
int x_len = matrix.size();
int y_len = matrix[0].size();
while (direction[1] + direction[3] != matrix.size() && \
direction[0] + direction[2] != matrix[0].size()) {
switch(foo) {
// left-->right
case 0:
y ++;
for (; y < y_len - direction[foo]; y ++) {
re.push_back(matrix[x][y]);
}
y --;
direction[3] ++;
break;
// up-->down
case 1:
x ++;
for (; x < x_len - direction[foo]; x ++) {
re.push_back(matrix[x][y]);
}
x --;
direction[0] ++;
break;
// right-->left
case 2:
y --;
for (; y >= direction[foo]; y --) {
re.push_back(matrix[x][y]);
}
y ++;
direction[1] ++;
break;
// down-->up
case 3:
x --;
for (; x >= direction[foo]; x --) {
re.push_back(matrix[x][y]);
}
x ++;
direction[2] ++;
break;
}
foo = (++foo) % 4;
}
return re;
}
};
int main(int argc, char* argv[]) {
Solution so;
vector<vector<int> > test(3, vector<int>(3, 0));
for (int i = 0; i < 9; i ++) {
test[i / 3][i % 3] = i + 1;
}
vector<int> re = so.spiralOrder(test);
for (int i = 0; i < re.size(); i ++) {
cout<<re[i]<<" ";
}
return 0;
}