从1到n的平方,按照从小到大,顺时针打印

来源:互联网 发布:淘宝客软件下载 编辑:程序博客网 时间:2024/06/09 23:05

首先看个例子,就是n=3的时候, 1    2     3

                                                    8    9     4

                                                    7    6      5

然后是n=4的时候,                    1     2     3     4

                                                  12   13   14    5

                                                  11    16  15   6

                                                   10    9     8    7

分析此题的时候首先要看到,当n=3,4的时候我们看到这些数字围成的正方形层数都是2,大家可以分析一下,当n%2==0的时候正方形的层数是n/2,当n%2==1的时候正方形的层数为n/2+1。而且还可以得知,当层数为偶数的时候,最里层的正方形有4个数字,奇数的时候有1个数字,以上是对层数和点数的分析。

那下面首先把程序贴上来,然后在分析。根据上面的分析可以得知层数level然后设定循环。看n=4,的时候,有两层,先扫描第一层,把上侧前n-level-1个数字当做上侧的数字,比如 1,2,3,4,只取1,2,3保留4,把4,5,6当做右侧的一组数据,7,8,9当做下侧的数据,

10,11,12,当做左侧的数据,大家看,现在把第一层的数据分成了三组,那第二层的13,14,1,5,16分别是上侧,右侧,下侧和左侧的数据,分析到这就好办了。因为每层的数字都是按照顺时针方向递增的,而且右侧的第一个数据是上侧最后一个数据的加1,所以要保留每侧数据的最后一个值。 左侧数据的递归式是,行不变,列变,则有:i=level-1;i<n-level;i++; a[level-1][i]=k3+count;count++;之后大家分析我的程序吧。这应该是个数学问题。(分析的比较潦草,但是程序还是挺健壮的,大家多指点)。

#include <stdio.h>  #include<stdlib.h> void main() {int n;int i,j;int k,k1,k2,k3;int level;int count;while(true){k3=0;scanf("%d",&n);int **a=(int**)malloc(sizeof(int)*n);for(i=0;i<n;i++)a[i]=(int*)malloc(sizeof(int)*n);for(i=0;i<n;i++)for(j=0;j<n;j++) {a[i][j]=0;}for(level=1;level<=n/2;level++) {count=0;for(i=level-1;i<n-level;i++) { count++;a[level-1][i]=k3+count;           //扫描每层的上层的数字}k=a[level-1][i-1];count=0;for(i=level-1;i<n-level;i++) {//扫描每层的右侧的数字count++;a[i][n-level]=k+count;}k1=a[i-1][n-level];count=0;for(i=n-level;i>=level;i--) {//扫描每层的底侧的数字count++;a[n-level][i]=k1+count;}k2=a[n-level][i+1]; count=0;for(i=n-level;i>=level;i--) {//扫描每层的左侧数字count++;a[i][level-1]=k2+count;}k3=a[i+1][level-1];}if(n%2==1) a[n/2][n/2]=k3+1;for(i=0;i<n;i++)for(j=0;j<n;j++){printf("%d\t",a[i][j]);if(j==n-1)printf("\n");}}}



原创粉丝点击