首先看个例子,就是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");
}
}
}