【算法设计】打印螺旋数组

看到一个很简单的题目,很想小时候数学课本后面找规律的思考题。

题目

给定N打印如下数组:


解法一:循环N螺旋赋值


比较直观的思路是根据N来找规律。可以看到N为奇数时,数组是逆时针循环赋值;N为偶数时,顺时针。如下图所示:


所以在最外层循环N,很容易写出代码:

[cpp]  view plain copy
  1. int n=0;cin>>n;  
  2. vector<vector<int> > T(n,vector<int>(n,0));  
  3. int num=0;  
  4. for(int k=1;k<=n;k++){  
  5.     //奇数时逆时针赋值  
  6.     if(k%2==1){  
  7.         for(int j=0;j<k;j++)  
  8.             T[k-1][j]=++num;  
  9.         for(int i=k-2;i>-1;i--)  
  10.             T[i][k-1]=++num;  
  11.     }  
  12.     //偶数时顺时针赋值  
  13.     else{  
  14.         for(int i=0;i<k;i++)  
  15.             T[i][k-1]=++num;  
  16.         for(int j=k-2;j>-1;j--)  
  17.             T[k-1][j]=++num;  
  18.     }  
  19. }  

解法二:直接找数组规律

仔细观测数组,发现数组可以分为上下两个三角。在上三角中,数组纵坐标小于等于横坐标,数组纵向连续;下三角中,横坐标小于等于纵坐标,数组横向连续。

上三角:

上三角中,暗纵坐标的奇偶性分为两种情况。
  • 纵坐标为奇数时,T[1][i]=i*i,即上图中第1,3,5列第一个元素分别为1,9,25。每列由上至下递减,即第3列3个元素分别为9,8,7.
  • 纵坐标为偶数时,T[1][i]=(i-1)*(i-1)+1,即上图中第2,4,6列第一个元素分别为1+1=2,9+1=10,25+1=26。每列由上至下递增,即第4列4个元素分别为10,11,12,13.

上三角:

下三角中,按横坐标的奇偶性分为两种情况:
  • 横坐标为偶数时,T[i][1]=i*i,即上图中第2,4,6行第一个元素分别为4,16,36。每行由左至右递减,即第4行3个元素分别为16,15,14.
  • 横坐标为奇数时,T[i][1]=(i-1)*(i-1)+1,即上图中第3,5行第一个元素分别为4+1=5,16+1=17。每行由左至右递增,即第5行4个元素分别为17,18,19,20.

代码如下:
[cpp]  view plain copy
  1. int n=0;cin>>n;  
  2. vector<vector<int> > T(n,vector<int>(n,0));  
  3. for(int i=0;i<n;i++){  
  4.     for(int j=0;j<n;j++){  
  5.         if(j>=i){  
  6.             if(j%2==0)  
  7.                 T[i][j]=(j+1)*(j+1)-i;  
  8.             else  
  9.                 T[i][j]=j*j+i+1;  
  10.         }  
  11.         else{  
  12.             if(i%2==1)  
  13.                 T[i][j]=(i+1)*(i+1)-j;  
  14.             else  
  15.                 T[i][j]=i*i+j+1;  
  16.         }  
  17.     }  
  18. }  


http://blog.csdn.net/xiaowei_cqu/article/details/8258071

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值