下面是一个5×5的螺旋方阵,试编程打印出此形式的n×n(n<10)阶的方阵。
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
此题的关键在于如何有效控制填充数的位置,从题中可以发现,填充数是按着“先向右,再向下,再向左,再向上”的顺序进行变化的,不妨将其称为方向。如果方向知道了,则下一个需要填充的位置也就知道了。因此,这个题的关键在于有效控制方向。方向的变化也需要根据填充数的位置进行,并应该与已经填充的数字避免冲突。因此,可以首先将数组中所有位置赋初值0,随着填充的进行,如果数不为0,则说明这个位置已经填上数字,因此方向应该发生改变。
参考代码如下:
#include <stdio.h>
#define N 5
int main()
{
int a[N][N]={0};
int direction=1;
int i,j;
int x,y;
x=0;y=0; //initial position
for(i=1;i<=N*N;i++)
{
a[x][y]=i;
switch(direction)
{
case 1: if(a[x][y+1]||y==N-1)
direction=2;
break;
case 2: if(a[x+1][y]||x==N-1)
direction=3;
break;
case 3: if(a[x][y-1]||y==0)
direction=4;
break;
case 4: if(a[x-1][y]||x==0)
direction=1;
break;
}
switch(direction){
case 1: y++; break;
case 2: x++; break;
case 3: y--; break;
case 4: x--; break;
}
}
for(i=0;i<N;i++){
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}