所谓“螺旋方阵”,是指对任意给定的N,将1到N*N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入NxN的方阵里。本题要求构造这样的螺旋方阵。
【输入】
输入在一行中给出一个正整数N(<10)。
【输出】
输出NxN的螺旋方阵。每行N个数字,每个数字占3位。
【样例输入】
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
参照海龟行走的做法,用一对变量A,B模拟海龟头的方向,根据屏幕坐标的特点,A、B的取值和“海龟头”方向有这样的关系:(0,1)表示向右;(0, -1)表示向左;(-1,0)表示向上;(1,0)表示向下;用另一对变量X,Y模拟海龟位置,“海龟”每前进一步,它的新位置即为X=X+A,Y=Y+B;要海龟向右转,就改变A、B的值,根据direction的值用switch改变。下面用自然语言对算法进行描述:让海龟先走n步,然后右转,再走n-1步,再右转,再走n-1步,再右转,再走n-2步,再右转,再走n-2步……如此类推,直到海龟前进的步数为0时停止;而每当“海龟”前进1步,就在它位置上显示一个数字,那么前进n步即重复执行“X:=X+A,Y:=Y+B”语句n次。但如何让下两个循环的重复次数都为n-1呢?解决的方法是:循环n次后,让n的值减少0.5,然后再转回执行同样的循环。
My program
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main(void)
{
int count = 1; //数组中该存的值
double n; //控制循环次数
int matrix[N][N];
int i, j; //输出数组
int direction = 0;
int a, b; //用于数组改变方向
int x = 0, y = -1; //数组的下标
int temp;
scanf("%lf", &n);
temp = n;
while(n)
{
switch(direction) // direction指示方向, 0向右, 1向下, 2向左, 3向上
{
case 0:
a = 0;
b = 1;
break;
case 1:
a = 1;
b = 0;
break;
case 2:
a = 0;
b = -1;
break;
case 3:
a = -1;
b = 0;
break;
}
for(i=n; i>0; i--)
{
x = x+a;
y = y+b;
matrix[x][y] = count;
count++;
}
direction += 1;
direction %= 4;
n -= 0.5;
}
for(i=0; i<temp; i++)
{
for(j=0; j<temp; j++)
{
printf("%3d", matrix[i][j]);
}
printf("\n");
}
return 0;
}