给定一个正整数 n,生成一个包含1到 n^2所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入:3输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:
此题的关键点是在4个顶点上,4个顶点容易边界混乱,为了保证4条边的处理方式一样,4个for循环通一是一个顶点一条边。
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
代码:
//螺旋矩阵Ⅱ
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int count=1,i=0,j=0;
int startx=0,starty=0,offset=1;
int n;
cin>>n;
int loop = n/2; //由于堆成,只需要循环n/2次
int mid = n/2; //矩阵最中心的位置
vector<vector<int> > arry(n,vector<int>(n,0)); //二维的vector记得> >之间有个空格,不然会报错
while(loop--)
{
for(j=starty;j<n-offset;j++)
{
arry[startx][j] = count++; //因为这个时候i还没有定义,所以要用startx
}
for(i=startx;i<n-offset;i++)
{
arry[i][j] = count++;
}
for(;j>starty;j--)
{
arry[i][j] = count++;
}
for(;i>startx;i--)
{
arry[i][j] = count++;
}
startx++;
starty++;
offset++;
}
if(n%2) //如果n为奇数,直接给矩阵中心填一个数就行
{
arry[mid][mid] = count;
}
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout.width(3);
cout<<arry[i][j]<<" ";
}
cout<<endl;
}
return 0;
}