看到一个很简单的题目,很想小时候数学课本后面找规律的思考题。
题目
给定N打印如下数组:
解法一:循环N螺旋赋值
比较直观的思路是根据N来找规律。可以看到N为奇数时,数组是逆时针循环赋值;N为偶数时,顺时针。如下图所示:
所以在最外层循环N,很容易写出代码:
int n=0;cin>>n; vector<vector<int> > T(n,vector<int>(n,0)); int num=0; for(int k=1;k<=n;k++){ //奇数时逆时针赋值 if(k%2==1){ for(int j=0;j<k;j++) T[k-1][j]=++num; for(int i=k-2;i>-1;i--) T[i][k-1]=++num; } //偶数时顺时针赋值 else{ for(int i=0;i<k;i++) T[i][k-1]=++num; for(int j=k-2;j>-1;j--) T[k-1][j]=++num; } }
解法二:直接找数组规律
仔细观测数组,发现数组可以分为上下两个三角。在上三角中,数组纵坐标小于等于横坐标,数组纵向连续;下三角中,横坐标小于等于纵坐标,数组横向连续。
上三角:
上三角中,暗纵坐标的奇偶性分为两种情况。
- 纵坐标为奇数时,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.
代码如下:
int n=0;cin>>n; vector<vector<int> > T(n,vector<int>(n,0)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(j>=i){ if(j%2==0) T[i][j]=(j+1)*(j+1)-i; else T[i][j]=j*j+i+1; } else{ if(i%2==1) T[i][j]=(i+1)*(i+1)-j; else T[i][j]=i*i+j+1; } } }
(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)