蛇形填数(矩阵)

蛇形填数

       在 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,结果如下:


你可能感兴趣的:(java,数学,矩阵,蛇形矩阵,蛇形填数)