题目描述:
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]解题思路:
使用一个数组steps记录四个方向上(向右,向下,向左,向上)每次可以移动的步长,steps数组初始化为[n, n - 1, n - 1, n - 2],
每经过一圈每个方向上的移动步长就减2,如果遇到某方向上的移动步长小于等于0,则说明所有的元素都已经访问。
另外需要注意第一圈向右移动的步长和其它圈的向右移动的步长的处理有些不一样,
这是因为第一圈向右移动的时候所有第一行的元素都还没有被访问。
AC代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
if (n <= 0) return vector<vector<int>>();
vector<vector<int>> ans(n,vector<int>(n,0));
vector<int> steps = { n, n - 1, n - 1, n - 2 };
int row = 0, col = 0;
int times = 0;
int cur_value = 1;
while (1){
//向右
if (steps[0] > 0){
if (times == 0){
for (int i = 0; i < steps[0]; ++i){
ans[row][col + i] = cur_value++;
}
col += steps[0] - 1;
}
else{
for (int i = 1; i <= steps[0]; ++i){
ans[row][col + i] = cur_value++;
}
col += steps[0];
}
++times;
steps[0] -= 2;
}
else{
break;
}
//向下
if (steps[1]>0){
for (int i = 1; i <= steps[1]; ++i){
ans[row + i][col] = cur_value++;
}
row += steps[1];
steps[1] -= 2;
}
else{
break;
}
//向左
if (steps[2] > 0){
for (int i = 1; i <= steps[2]; ++i){
ans[row][col - i] = cur_value++;
}
col -= steps[2];
steps[2] -= 2;
}
else{
break;
}
//向上
if (steps[3] > 0){
for (int i = 1; i <= steps[3]; ++i){
ans[row - i][col] = cur_value++;
}
row -= steps[3];
steps[3] -= 2;
}
else{
break;
}
}
return ans;
}
};