蛇形填数
在 n x n 方针里填入 1,2,...,n x n,要求填成蛇形。例如:n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。n <= 8。
【分析】
类比数学中的矩阵,可以用一个二维数组来储存题目中的方阵。只需声明一个“int a[maxn][maxn]”,就可以获得一个大小为 maxn x maxn的方阵。在声明时,二维的大小不必相同,因此也可以声明 int a[30][50]这样的数组,第一维下标范围是 0,1,2,...,29,第二维下标范围是0,1,2,...,49。
从1开始依次填写。设“笔”的坐标为(x,y),则一开始x=0,y=n-1,即第0行,第n-1列(行列的范围是 0~n-1,没有第n列)。“笔”的移动轨迹是:下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。总之,先是下,到不能填为止,然后是左,接着是上,最后是右。“不能填”是指再走就出界(例如4到5),或者再走就要走到以前填过的格子(例如12到13)。如果把所有格子初始化为0,就能很方便地加以判断。
用c语言编写程序,代码如下:
<span style="font-size:18px;">#include<stdio.h>
#include<string.h>
#define maxn 20
int a[maxn][maxn];
int main() {
int n, x, y, tot = 0;
scanf("%d", &n);
memset(a, 0, sizeof(a));
a[x = 0][y = n - 1] = tot = 1;
while (tot < n * n) {
while (x + 1 < n && !a[x + 1][y]) a[++x][y] = ++tot;
while (y - 1 >= 0 && !a[x][y - 1]) a[x][--y] = ++tot;
while (x - 1 >= 0 && !a[x - 1][y]) a[--x][y] = ++tot;
while (y + 1 < n && !a[x][y + 1]) a[x][++y] = ++tot;
}
for (x = 0; x < n; x++) {
for (y = 0; y < n; y++)
printf("%3d", a[x][y]);
printf("\n");
}
return 0;
}</span>
运行程序,输入 4,结果如下:
标签:++,矩阵,tot,int,while,填数,maxn,蛇形,&& From: https://blog.51cto.com/u_15894233/5893350