题干
所谓“螺旋方阵”,是指对任意给定的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
结尾无空行
简单分析一下
无非是转圈赋值,因此只要知道前进的方向、和前进的长度,即可用for循环把值填进去,前进方向和长度可以简单找规律得到
#include<stdio.h>
int main(void) {
int a[10][10], n, count = 1, x = 0, y = 0, dir = 0, l, flag = 0;
scanf("%d", &n);
l = n - (flag + 1) / 2;
while (count <= n * n && l > 0) {
l = n - (flag + 1) / 2; //步长
flag++;
switch (dir) {
case 0:
for (int i = 0; i < l; i++) {
a[y][++x - 1] = count++;
}
x -= 1;
y++;
break;
case 1:
for (int i = 0; i < l; i++) {
a[++y - 1][x] = count++;
}
y -= 1;
x--;
break;
case 2:
for (int i = 0; i < l; i++) {
a[y][--x + 1] = count++;
}
x += 1;
y--;
break;
case 3:
for (int i = 0; i < l; i++) {
a[--y + 1][x] = count++;
}
y += 1;
x++;
break;
}
dir = (dir + 1) % 4; //得到方向
}
int j, i;
for ( i = 0; i < n; i++) {
for ( j = 0; j < n; j++) {
printf("%3d", a[i][j]);
}
if (i != n - 1) {
printf("\n");
}
}
return 0;
}
再找找规律, 简单改进一下
第一层代表矩阵的圈数,第二层代表打印一圈,第三层打印一圈中的四条边(此时要注意打印元素最大值的限制即count<=n*n)
这里对具体的规律做出补充,不难看出
y++, 向右 k = 0
x--, 向下 k = 1
y--, 向左 k = 2
x++, 向上 k = 3
#include<stdio.h>
int main(void) {
int a[100][100], n, count = 1, x = 0, y = 0;
scanf("%d", &n);
for (int i = 0; i < (n + 1) / 2; i++) {
x = i;
y = i;
for (int k = 0; k < 4; k++) {
int j = 0;
do {
if (!(k % 2) && count <= n * n) {
if (k / 2) a[x][y--] = count++;
else a[x][y++] = count++;
} else if ( count <= n * n) {
if (!((k - 1) / 2)) a[x++][y] = count++;
else a[x--][y] = count++;
}
j++;
} while (j < n - 1 - 2 * i);//此处用for不能写出等价表达,考虑n为奇数的最后一次
}
}
int j, i;
for ( i = 0; i < n; i++) {
for ( j = 0; j < n; j++) {
printf("%3d", a[i][j]);
}
if (i != n - 1) {
printf("\n");
}
}
return 0;
}