今天,继续讲趣味数组。
1.编程然后请输出这样的一个数组:
这和我们线代中学的上三角矩阵有点类似。我们在处理这个问题时,我们按照层来处理,不是一般的行列。
那么啥是层呢?例如:1就是第一层,2,3 就是第二层,456就是第三层,以此类推。在这里我们可以发现,层号和这个层里面所包含的元素个数是相同的。
设层号是 i,每一层所包含的元素个数为 j。那么,i 的范围是 i∈[1,n], j∈[1,i].
这样我们就能很快的找出每一个元素位置的坐标关系:a[i-j+1][j]
代码如下:
int a[100][100];// int n; scanf("%d",&n); int i,j;//i层数,j层内元素的个数 int k=1; memset(a,0,sizeof(a)); for (i=1;i<=n;i++) { for (j=1;j<=i;j++) { a[i-j+1][j]=k; //因为i∈[1,n],j∈[1,i],在这里我们是从左下角斜向上开始,行i减少,列j增加。根据,i和j的关系,每一层元素的个数等于这一层的层数,因此它的关系是i-j+1 //相当于从i中取j。 k++; } } for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { if (a[i][j]!=0) { printf("%4d",a[i][j]); } } printf("\n"); }
在这里,我们使用上一篇螺旋数组的思路来处理这个问题。
我们可以将这个数组看成这样的:
最外层是有1组成的,次外层是有2组成的,以此类推。
我们也可以将这个数组看成螺旋数组。这个数组分别在圈住的1和2处,改变方向并且数值增加。
数组本来从左上角的1开始螺旋增加,然后在圈住的1开始,数值增加,由1变成2.因此我们只需要将上一篇中螺旋数组的代码修改一下,就能实现这个数组。
代码如下:
int a[100][100],b[2]; int k;//每一层有几个数 int t=1;//t=1在左下角,t=-1在右下角 int x=1,y,n; memset(a,0,sizeof(a)); b[0]=-1; b[1]=0; scanf("%d",&n); k=n; int num=1; if (n<3) { printf("ERROR"); } else { while(x<=n*n) { for(y=0;y<2*k-1;y++) { b[y/k]=b[y/k]+t; a[b[0]][b[1]]=num; x++; } k--; if ((k%2!=0)&&(n%2!=0))//输入的是奇数 { num++; } if ((k%2==0)&&(n%2==0))//输入的是偶数 { num++; } t=-t; } } for (int i=0;i<100;i++) { for(int j=0;j<100;j++) if (a[i][j]) { printf("%4d",a[i][j]); } printf("\n"); }这个算法还有很高的改进空间,我的这个方法有点笨拙,欢迎各位看官中的大神,给出更加高效的算法。我们一同进步嘛!!
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/jin_syuct/article/details/47206207