今天偶然翻出了初学编程时候写的一个螺旋矩阵算法,看到一个大循环嵌套四个小循环的时候,立时觉得设计不良。经过改进之后,以 i j 变量指示方向,使得循环统一为一个。
如下便是一个螺旋矩阵,一眼就能知道怎么回事了
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
下面是C源码
#include "stdio.h"
int main()
{
int a[100][100] = {0},
i = 0, j = 1, x = 1, y = 0, k = 0, n = 0, m = 0, end;
int direction[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
printf("Enter a number (<20):");
scanf("%d", &n);
end = n * n;
a[1][n + 1] = a[n + 1][n] = a[n][0] = -1;
a[x][y] = 0;
while (1)
{
if (end == a[x][y])
break;
if (a[x + i][y + j] == 0)
{
a[x + i][y + j] = a[x][y] + 1;
x += i;
y += j;
}
else
{
k = (k + 1) % 4;
i = direction[k][0];
j = direction[k][1];
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
}