笔试题里螺旋矩阵的C++简单实现

最近笔试时,被人问道螺旋矩阵的输出问题,当时紧张,想的不是很透彻,回去研究一番,实现如下:

比如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);//瘦了两圈
}


结果如图:


  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值