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 ] ]
题意很明了,就是给出一个n * n的矩阵,按照顺时针赋值为1 到 n*n的值。 解法如下: 我定义4个方向(上下左右)表示目前的行走方向,初始设置位置为
0,-1 因为一开始向右走 方向定为右。然后按照顺时针复制, 当遇到边界的时候改变方向,当方向朝上并且遇到边界的时候,把边界减小1,然后改变方向
举例如下图,
class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<vector<int> > matrix(n, vector<int>(n));
int x = 0, y = -1, row = n, col = n;
enum direction {UP, DOWN, LEFT, RIGHT} d;
d = RIGHT;
for (int i = 0; i < n * n; ++i)
{
switch(d) {
case RIGHT:
{
if (y == col - 1)
{
++x;
d = DOWN;
}
else
++y;
break;
}
case DOWN:
{
if (x == row - 1)
{
--y;
d = LEFT;
}
else
++x;
break;
}
case LEFT:
{
if (y == n - col)
{
--x;
d = UP;
}
else
--y;
break;
}
case UP:
{
if (x == n - row + 1)
{
++y;
--row;
--col;
d = RIGHT;
}
else
--x;
break;
}
}
matrix[x][y] = i + 1;
}
return matrix;
}
};