要求输出下列形式的数组:
| 1 | 2 | 3 | 4 | 5 |
| 16 | 17 | 18 | 19 | 6 |
| 15 | 24 | 25 | 20 | 7 |
| 14 | 23 | 22 | 21 | 8 |
| 13 | 12 | 11 | 10 | 9 |
这里,先暂时考虑N=5的情况。
从最外一层开始,即从下表的红色加粗数字所示:
| 1 | 2 | 3 | 4 | 5 |
| 16 | 17 | 18 | 19 | 6 |
| 15 | 24 | 25 | 20 | 7 |
| 14 | 23 | 22 | 21 | 8 |
| 13 | 12 | 11 | 10 | 9 |
然后再往里一层,即从下表的红色加粗数字所示:
| 1 | 2 | 3 | 4 | 5 |
| 16 | 17 | 18 | 19 | 6 |
| 15 | 24 | 25 | 20 | 7 |
| 14 | 23 | 22 | 21 | 8 |
| 13 | 12 | 11 | 10 | 9 |
然后再往里一层,即从下表的红色加粗数字所示:
| 1 | 2 | 3 | 4 | 5 |
| 16 | 17 | 18 | 19 | 6 |
| 15 | 24 | 25 | 20 | 7 |
| 14 | 23 | 22 | 21 | 8 |
| 13 | 12 | 11 | 10 | 9 |
表3
假定数组为a[N+1][N+1]
分析表1:
当i=1
for(j=1;j<N;j++)
a[1][j]=0*(N-1)+j;//这是数字1、2、3和4的输出
for(j=1;j<N;j++)
a[j][N]=1*(N-1)+j;//这是数字5、6、7和8的输出
for(j=1;j<N;j++)
a[N][N-j+1]=2*(N-1)+j;//这是数字9、10、11和12的输出
for(j=1;j<N;j++)
a[N-j+1][1]=3*(N-1)+j;//这是数字13、14、15和16的输出
分析表2:
i=2
for(j=1;j<N-2;j++)
a[2][j+1]=base+0*(N-3)+j;//这是数字17和18的输出,其中base=16,表示上一轮已经输出的数字的总个数
for(j=1;j<N-2;j++)
a[j+1][N-1]=base+1*(N-3)+j;//这是数字19和20的输出,其中base=16,表示上一轮已经输出的数字的总个数
for(j=1;j<N-2;j++)
a[N-1][(N-1)-j+1]=base+2*(N-3)+j;//这是数字21和22的输出,其中base=16,表示上一轮已经输出的数字的总个数
for(j=1;j<N-3;j++)
a[(N-1)-j+1][2]=base+3*(N-3)+j;//这是数字23和24的输出,其中base=16,表示上一轮已经输出的数字的总个数
如果N=5,最后一轮输出25,单独处理。
现在进行整合:
i=1:
for(j=1;j<N;j++)
{
a[1][j]=0*(N-1)+j;//这是数字1、2、3和4的输出
a[j][N]=1*(N-1)+j;//这是数字5、6、7和8的输出
a[N][N-j+1]=2*(N-1)+j;//这是数字9、10、11和12的输出
a[N-j+1][1]=3*(N-1)+j;//这是数字13、14、15和16的输出
}
i=2:
for(j=1;j<N-2;j++)
{
a[2][j+1]=base+0*(N-3)+j;//这是数字17和18的输出,其中base=16,表示上一轮已经输出的数字的总个数
a[j+1][N-1]=base+1*(N-3)+j;//这是数字19和20的输出,其中base=16,表示上一轮已经输出的数字的总个数
a[N-1][(N-1)-j+1]=base+2*(N-3)+j;//这是数字21和22的输出,其中base=16,表示上一轮已经输出的数字的总个数
a[(N-1)-j+1][2]=base+3*(N-3)+j;//这是数字23和24的输出,其中base=16,表示上一轮已经输出的数字的总个数
}最后合成一个(最后一个数字单独处理):
for(i =1; i <= N/2; i++)
{
for(j=1; j < N-2*i+2; j++)
{
a[i][j+i-1]=base[i-1]+0*(N-(2*i-1))+j;
a[j+i-1][N-(i-1)] = base[i-1]+1*(N-(2*i-1))+j;
a[N-(i-1)][(N-(i-1))-j+1] = base[i-1]+2*(N-(2*i-1))+j;
a[(N-(i-1))-j+1][i] = base[i-1]+3*(N-(2*i-1))+j;
}
}
最后一个数字单独处理如下:
a[1+N/2][1+N/2]=ipBase[N/2]+1;
当N=5的时候,base数组如下:
int base[3] = {0, 16, 24};
更一般的:
int *ipBase = (int *)malloc(sizeof(int)*(1+N/2));
*(ipBase)=0;
for(i = 1; i < 1+N/2; i++)
{
int iTempSum = 0;
for(j = 1 ; j <= i; j++)
{
iTempSum = iTempSum + 4*(N-2*j+1);
}
*(ipBase+i)=iTempSum;
}
这里base数组为什么有3个元素,而且为什么他们的值是[0,16,24]?
可以认为输出了3次,每次对应一圈数字,如上的3个表。
在输出表1中红色粗体数字1-16的时候,之前的输出的数字总个数为0;
在输出表2中红色粗体数字17-24的时候,之前的输出的数字总个数为16=0+4*(N-1);
在输出表3中红色粗体数字25的时候,之前的输出的数字总个数为24=16+4*(N-3)=0+4*(N-1)+4*(N-3);
同理当N=7的时候base数组的值如下:
base[4]={0,24,40,48}。
base[0]=0;
base[1]=24=0+4*(N-1);
base[2]=40=24+4*(N-3)=0+4*(N-1)+4*(N-3);
base[3]=48=40+4*(N-5)=24+4*(N-3)+4*(N-5)=0+4*(N-1)+4*(N-3)+4*(N-5);
看规律就能得出以上循环方式。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int iDemension;
printf("Input the demension of the array:");
scanf("%d", &iDemension);
int i,j;
int **a = (int **)malloc(sizeof(int *)*(iDemension+1));
for(i = 0; i < iDemension+1; i++)
{
*(a+i) = (int *)malloc(sizeof(int)*(iDemension+1));
}
int N=iDemension;
for(i = 0; i <=N; i++)
for(j = 0; j <=N; j++)
a[i][j]=0;
//int base[3] = {0, 16, 24};
int *ipBase = (int *)malloc(sizeof(int)*(1+N/2));
*(ipBase)=0;
for(i = 1; i < 1+N/2; i++)
{
int iTempSum = 0;
for(j = 1 ; j <= i; j++)
{
iTempSum = iTempSum + 4*(N-2*j+1);
}
*(ipBase+i)=iTempSum;
}
for(i =1; i <= N/2; i++)
{
for(j=1; j < N-2*i+2; j++)
{
a[i][j+i-1]=ipBase[i-1]+0*(N-(2*i-1))+j;
a[j+i-1][N-(i-1)] = ipBase[i-1]+1*(N-(2*i-1))+j;
a[N-(i-1)][(N-(i-1))-j+1] = ipBase[i-1]+2*(N-(2*i-1))+j;
a[(N-(i-1))-j+1][i] = ipBase[i-1]+3*(N-(2*i-1))+j;
}
}
if(0 != N%2)
{
a[1+N/2][1+N/2]=ipBase[N/2]+1;
}
for(int i = 0; i <=N; i++)
{
for(int j = 0; j <=N; j++)
{
printf("%3d ", a[i][j]);
}
printf("\n");
}
return 0;
}等待完善......