最近笔试时,被人问道螺旋矩阵的输出问题,当时紧张,想的不是很透彻,回去研究一番,实现如下:
比如N=4的矩阵:
1 2 3 4 ----a排
12 13 14 5
11 16 15 6
10 9 8 7 -------c排
| |
d排 b排
首先确定的是需要一个二维数组ar[N][N]接收,N=4,则有两圈,外一圈从1--12;内一圈从13-16;很明显,可以设置一个循环:for count=0:N/2控制圈数;
对于每一圈而言,又是a,b,c,d,四个方向,比如先接收最外圈a排,可以用一个循环(j=0;j<N-1;i++)arr[0][j]=s++;(s=1),正好到第四列时,满足条件推出,巧合的是我们正需要从第四列开始接收每行数据,由此一个循环(i=0;i<N-1;i++) arr[i][4]=s++;依次类推。注意从外圈切换到内圈时候,由于d排时候行数加1才退出了d排循环,所以下一圈之前行数需减1.而且内圈起点又要加1,所以渐入内圈之前,s-1。代码如下:
const int N=5;//定义矩阵大小
int main(){
int ar[N][N]={0};//用二维数组承接
int i=0,j=0;
int start=1;
int t=N;
for(int count=0;count<N/2;count++)//一般螺旋数组依圈而行,有N大小,就有N/2圈
{for(;j<t-1;j++)
ar[i][j]=start++;//a
for(;i<t-1;i++)
ar[i][j]=start++;//b
for(j=t-1;j>count;j--)
ar[i][j]=start++;//c
for(i=t-1;i>count;i--)
ar[i][j]=start++;//d
t--;i++;start-=1;//进入下一圈
}//每圈对应a,b,c,d四排
if(N%2!=0){
ar[i][j+1]=start+1;}//如果N不是偶数时,需要加上最后一个数字
cout<<"inf: "<<endl;
for(i=0;i<N;i++){
for(j=0;j<N;j++)
cout<<setw(3)<<ar[i][j];//输出
cout<<endl;}
system("pause");
return 0;}
遍历实现:
void setmatrix(int **matrix,int x,int y,int start,int n){
if(n<=0)return;
int i,j;
if(n==1){matrix[x][y]=start;return;}
for(i=x;i<y+n-1;i++)matrix[y][i]=start++;//上部
for(j=y;j<x+n-1;j++)matrix[j][x+n-1]=start++;//右
for(i=x+n-1;i>x;i--)matrix[y+n-1][i]=start++;//底部
for(j=y+n-1;j>y;j--)matrix[j][x]=start;//左
setmatrix(matrix,x+1,y+1,start,n-2);//瘦了两圈
}
结果如图: