看到一个很简单的题目,很想小时候数学课本后面找规律的思考题。
题目
给定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;
- }
- }
- }