Spiral Matrix II
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 ] ]
有前面的Spiral Matrix作为基础就好做这道题了。
关键就是处理下标,要学会如何去跟踪下标,这个思维能力也需要锻炼。
锻炼好,那么就不需要20分钟就可以写出下面那么简练的程序了。
class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
int i = 0, j = n-1;
vector<vector<int> > res(n, vector<int>(n));
int num = 1;
for (; i < j; i++, j--)
{
for (int k = i; k <= j; k++)
{
res[i][k] = num;
num++;
}
for (int k = i+1; k < j; k++)
{
res[k][j] = num;
num++;
}
for (int k = j; k >= i; k--)
{
res[j][k] = num;
num++;
}
for (int k = j-1; k > i; k--)
{
res[k][i] = num;
num++;
}
}
//n为基数,剩下一个空格的时候,不能重复填了。额外处理。
if (i == j) res[i][j] = num;
return res;
}
};
class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
int i = 0, j = n-1;
vector<vector<int> > res(n, vector<int>(n));
int num = 1;
for (; i < j; i++, j--)
{
for (int k = i; k <= j; k++)
{
res[i][k] = num;
num++;
}
for (int k = i+1; k < j; k++)
{
res[k][j] = num;
num++;
}
for (int k = j; k >= i; k--)
{
res[j][k] = num;
num++;
}
for (int k = j-1; k > i; k--)
{
res[k][i] = num;
num++;
}
}
//n为基数,剩下一个空格的时候,不能重复填了。额外处理。
if (i == j) res[i][j] = num;
return res;
}
};
测试程序:
int main()
{
Solution solu;
vector<vector<int> > v = solu.generateMatrix(10);
for (auto x:v)
{
for (auto y:x)
cout<<y<<"\t";
cout<<endl;
}
system("pause");
return 0;
}
漂亮的打印结果:
int main()
{
Solution solu;
vector<vector<int> > v = solu.generateMatrix(10);
for (auto x:v)
{
for (auto y:x)
cout<<y<<"\t";
cout<<endl;
}
system("pause");
return 0;
}
//2014-1-29 update
vector<vector<int> > generateMatrix(int n)
{
vector<vector<int> > rs(n, vector<int>(n));
int c = 1, i = 0;
for (n--; i < n; i++, n--)
{
for (int j = i; j < n; j++, c++)
rs[i][j] = c;
for (int j = i; j < n; j++, c++)
rs[j][n] = c;
for (int j = n; j > i ; j--, c++)
rs[n][j] = c;
for (int j = n; j > i ; j--, c++)
rs[j][i] = c;
}
if (i == n) rs[i][i] = c;
return rs;
}
//2014-1-29 update
vector<vector<int> > generateMatrix(int n)
{
vector<vector<int> > rs(n, vector<int>(n));
int c = 1, i = 0;
for (n--; i < n; i++, n--)
{
for (int j = i; j < n; j++, c++)
rs[i][j] = c;
for (int j = i; j < n; j++, c++)
rs[j][n] = c;
for (int j = n; j > i ; j--, c++)
rs[n][j] = c;
for (int j = n; j > i ; j--, c++)
rs[j][i] = c;
}
if (i == n) rs[i][i] = c;
return rs;
}