leetcode编程记录18 #59 Spiral Matrix II
标签(空格分隔): leetcode c++
这道题是一道稍微有点复杂的题目,以前自己做的时候做了很久才做出来,现在加了一些数据结构进去,更简单地做了出来,题目如下:
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
题目分析和理解:
这道题目的意思是要我们对于给定的n*n的矩阵按照顺时针的方向从1到n*n进行赋值,这样的话我们可以给定一个初始的矩阵坐标(y,x)然后在数组中保存移动的方向,一开始按照一个方向移动,然后在超出数组范围或者遇到已经赋值了的矩阵位置时再进行改变方向,在进行了n * n次操作之后结束赋值,返回结果。
代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<std::vector<int> >result;
for (int i = 0; i < n; ++i)
{
std::vector<int> v;
for (int i = 0; i < n; ++i)
{
v.push_back(0);
}
result.push_back(v);
}
int k = 0;
int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int y = 0, x = -1;
int flag = 0;
while(true) {
if (dir[flag][0] + y < n && dir[flag][1] + x < n && dir[flag][0] + y >= 0 && dir[flag][1] + x >= 0
&& result[dir[flag][0] + y][dir[flag][1] + x] == 0) {
k++;
y += dir[flag][0];
x += dir[flag][1];
result[y][x] = k;
}
else if(k == n * n) {
break;
}
else {
flag = (flag + 1) % 4;
}
}
return result;
}
};