原题:
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行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
思路:
首先应该对方阵进行初始化,我们把每个值都改为‘-1’,然后根据输入的数字是5,在(1,1)到(5,5)从‘-1’组成的大方阵中开辟出一块被‘-1’围住的全是‘0’的小方阵,我们将在这块方阵中通过改写元素,完成螺旋方阵。
我们可以把方阵中的每个数字当成一个机器人的站立位点,机器人只能站改写‘0’位点,当机器人检测出站立位点是‘0’时,它就会改写‘0’位点,如果检测出不是‘0’,那么它就要跳回去,根据具体情况改变前进方向。
那么怎么判断机器人应该往哪边拐弯呢?
机器人不断循环重复向下、向左、向上、向右拐弯,所以只要检测出第几次拐弯,就能确定方向。如何检测我会写在注释里。
当检测出机器人改写的数字等于输入数字的平方时,即可打印方阵,结束程序。
#include<stdio.h>
int s[150][150];
int main() {
int n, k = 0, t = 1, i = 1, j = 1;
scanf("%d", &n);
for ( i = 0; i < 150; i++) {
for ( j = 0; j < 150; j++) {
s[i][j] = -1;
}
}//初始化二维数组为‘-1’
for ( i = 1; i <= n; i++) {
for ( j = 1; j <= n; j++) {
s[i][j] = 0;
}
}//开辟出小方阵,就是机器人所能站立的位点
i = 1;
j = 1;//进入主体循环前,准备好i,j
for (; k < n * n;) {//一种子循环代表一种前进方向
if (t == 1) {//这里的t用来记录转向的次数
for (;;) {//向右前进
if (s[i][j] == 0) {//一旦检测出下一个位点不是‘0’,跳出这个循环,转到另一个方向
k++;
s[i][j] = k;
j++;
} else {
j--;//跳回去
i++;//站到下个方向的第一个位点上
t++;
break;
}
}
}
if (t == 2) {//向下前进
for (;;) {
if (s[i][j] == 0) {
k++;
s[i ][j] = k;
i++;
} else {
i-- ;
j--;
t++;
break;
}
}
}
if (t == 3) {//向左前进
for (;;) {
if (s[i][j] == 0) {
k++;
s[i][j] = k;
j--;
} else {
j++;
i--;
t++;
break;
}
}
}
if (t == 4) {//向上走
for (;;) {
if (s[i][j] == 0) {
k++;
s[i][j] = k;
i--;
} else {
i++;
j++;
t = 1;
break;
}
}
}
}
for (int i = 1; i <= n; i++) {//打印出螺旋方阵
for (int j = 1; j <= n; j++) {
printf("%d ", s[i][j]);
}
printf("\n");
}
return 0;
}
如果有更简单的程序,请私信发送给作者,感谢感谢。