1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
這種情況用模擬比較好推出,以1為坐標(biāo)原點(diǎn),一次遞增,遇到邊界則轉(zhuǎn)向
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 100

const int intx[]=
{0,1,0,-1};

const int inty[]=
{1,0,-1,0};
int main()


{
int dir,i,j,n,data,x,y,nextx,nexty;
int arr[MAX_SIZE][MAX_SIZE];

/**//*Read size*/
printf("please input the size\n");
scanf("%d",&n);

/**//*Init*/
x= y= 0;
dir= 0;
memset(arr,0,sizeof(arr));

/**//*fill*/
for(data=1; data<=n*n; data++)

{
arr[x][y]= data;
nextx= x+intx[dir];
nexty= y+inty[dir];
if(arr[nextx][nexty] || nextx>=n || nexty>=n || nextx<0 || nexty<0)

{
dir++;
if(dir==4)dir=0;
}
x+= intx[dir];
y+= inty[dir];
}
for(i=0; i<n; i++)

{
for(j=0; j<n; j++)
printf("%d\t",arr[i][j]);
printf("\n");
}
}
如果碰到另外一種情況就麻煩多了
21 22................
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
如果從中間開始模擬
從原點(diǎn)1開始,看方向的變化:右下左上;行走的步數(shù):11223344……
公式:n^2= 1+1+2+2+...+n-1+n-1+n(第一種情況也有用到)
有了公式,那就可以先算出最大的data是多少,這樣又轉(zhuǎn)換為第一種方法了。
如果沒(méi)有公式,單純對(duì)行為進(jìn)行模擬難度很大,不過(guò)還是可以實(shí)現(xiàn)的。
現(xiàn)在暫時(shí)還沒(méi)有想到實(shí)現(xiàn)的方法,想到以后再補(bǔ)充吧。