题目描述
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 ]
]
1. 一般求解:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > ret;
if(n == 0) return ret;
ret = vector<vector<int> > (n, vector<int>(n, 0));
int count = 0;
int size = n * n;
int rmin, rmax, cmin, cmax;
rmin = cmin = 0;
rmax = cmax = n - 1;
while(1)
{
for(int c = cmin; c <= cmax; c++)
{
ret[rmin][c] = ++count;
if(count >= size)
return ret;
}
for(int r = rmin + 1; r <= rmax; r++)
{
ret[r][cmax] = ++count;
if(count >= size)
return ret;
}
for(int c = cmax - 1; c >= cmin; c--)
{
ret[rmax][c] = ++count;
if(count >= size)
return ret;
}
for(int r = rmax - 1; r > rmin; r--)
{
ret[r][cmin] = ++count;
if(count >= size)
return ret;
}
cmin++, rmin++, cmax--, rmax--;
}
}
};
2. 状态机求解:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > ret;
if(n == 0) return ret;
ret = vector<vector<int> >(n, vector<int>(n, 0));
int size = n * n;
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int count = 0;
int r = 0, c = 0, direction = 0;
while(count < size)
{
switch(direction)
{
//topLeft->topRight
case 0:
ret[r][c++] = ++count;
//beyond the bounder, turn direction, turn to next position
if(c > right)
{
c--, r++;
direction = 1;
top++;
}
break;
//rightTop -> rightBottom
case 1:
ret[r++][c] = ++count;
if(r > bottom)
{
r--, c--;
right--;
direction = 2;
}
break;
//BottomRight -> bottomLeft
case 2:
ret[r][c--] = ++count;
if(c < left)
{
c++, r--;
bottom--;
direction = 3;
}
break;
//leftBottom -> leftTop
case 3:
ret[r--][c] = ++count;
if(r < top)
{
r++, c++;
left++;
direction = 0;
}
}
}
return ret;
}
};