#include
#define N 6
int a[N][N];
void go(int i,int j,int dir,int start,int final);
int main(void)
{
int n;
int i,j;
for(i=0;i
a[(N-1)/2][(N-1)/2]=1;
go((N-1)/2,(N-1)/2,0,2,N*N);
for(i=0;i
for(j=0;j
}
getch();
return 0;
}
void go(int i,int j,int dir,int start,int final)
{
int ri,rj,gi,gj;
if(start>final) return;
switch(dir)
{
case 0:rj=j+1;ri=i;gj=j;gi=i-1;break;
case 1:rj=j;ri=i+1;gj=j+1;gi=i;break;
case 2:rj=j-1;ri=i;gj=j;gi=i+1;break;
case 3:rj=j;ri=i-1;gj=j-1;gi=i;break;
default:break;
}
if(a[ri][rj]==0)
{
a[ri][rj]=start;
go(ri,rj,(dir+1)%4,start+1,final);
}
else
{
a[gi][gj]=start;
go(gi,gj,dir,start+1,final);
}
}
输出:
21 22 23 24 25 26
20 07 08 09 10 27
19 06 01 02 11 28
18 05 04 03 12 29
17 16 15 14 13 30
36 35 34 33 32 31
没看明白
这个有点意思
开个n*n的大矩阵(最好n为奇数),初始化为0.以中心点(n/2,n/2)为中心,依次扩展。向左就把横坐标-1,向右就把横坐标+1(j+1), 向下向上就++i或--i(行数+、-1)
至于向哪个方向扩展,要按下面顺序:
右->下->左->上 这样循环
如果向右走,要走到它的下面的元素是0的时候停止,然后向下
向下走,要走到它的左面元素为0的时候停止,然后向左
。。。
以此类推循环到结束,并记录结束时所在坐标
按行打印,遇到0元素换行
#include
#define
N
6
int
a[N][N];
void
go(int
i,int
j,int
dir,int
start,int
final);
int
main(void)
{
int
n;
int
i,j;
for(i=0;i
a[(N-1)/2][(N-1)/2]=1;
go((N-1)/2,(N-1)/2,0,2,N*N);
for(i=0;i
for(j=0;j
",a[i][j]);
printf("\n");
}
getch();
return
0;
}
void
go(int
i,int
j,int
dir,int
start,int
final)
{
int
ri,rj,gi,gj;
if(start>final)
return;
switch(dir)
{
case
0:rj=j+1;ri=i;gj=j;gi=i-1;break;
case
1:rj=j;ri=i+1;gj=j+1;gi=i;break;
case
2:rj=j-1;ri=i;gj=j;gi=i+1;break;
case
3:rj=j;ri=i-1;gj=j-1;gi=i;break;
default:break;
}
if(a[ri][rj]==0)
{
a[ri][rj]=start;
go(ri,rj,(dir+1)%4,start+1,final);
}
else
{
a[gi][gj]=start;
go(gi,gj,dir,start+1,final);
}
}
输出:
21
22
23
24
25
26
20
07
08
09
10
27
19
06
01
02
11
28
18
05
04
03
12
29
17
16
15
14
13
30
36
35
34
33
32
31