1. 程式人生 > >蛇形填數問題

蛇形填數問題

題目描述
在n×n方針裡輸入1,2,…,n*n,要求填成蛇形。例如,n=4時方陣為:
在這裡插入圖片描述
上面的方針中,多餘的空格只是為了便於觀察規律,不必嚴格輸出。n<=8。
題目分析
首先看到方針先要明白題目要求具體是從哪裡開始,即“蛇頭”在哪,最後要看明白“蛇尾”在哪。
在這裡插入圖片描述

如圖,整個蛇形填數的具體步驟已經明白,僅僅只是不斷重複這個步驟,填數到最後就好。
設(x,y)為當前填數的位置座標,則一開始的“蛇頭”位置則為(0,n-1),想到用二維陣列表示成a[0][n-1].(位置是在右上角,由於是陣列,所以是第0行,第n-1列),知道了這些,則按照如圖的箭頭所示開始向下走。但是這個蛇是盤著身體的,朝一個方向走總要有個頭,所以需要判斷是否越界。
有一個很好的方法就是“預判”,以第一步為例:
首先預判斷 x+1<n,不需要管y的值,因為y表示的是列數,沒有修改。預判到最後一個,是會理解為當前方向的下一步的座標為(x+1,y),只需一個"!a[x+1][y]"即可。其本身的位置沒有變,只是進行了前面所說的“預判”。當判斷未越界時,系統接著按此方向走,如果越界,則停止此步驟。

#include<stdio.h>
#include<string.h>
#define max 21
int a[max][max];
int main()
{
	int bot=0;
	int n,x,y;
	scanf_s("%d", &n);
	memset(a, 0, sizeof(a));//初始化陣列,將陣列a清零,它在string.h中定義
	bot = a[x = 0][y = n - 1] = 1;//將bot和”蛇頭“初始化為1
	while (bot < n*n) 
	{
		while (x < n - 1 && !a[x + 1][y])	a[++x][y] = ++bot;//向下走,判斷是否滿足條件且不越界
		while (y - 1 >= 0 && !a[x][y - 1])	a[x][--y] = ++bot;
		while (x - 1 >= 0 && !a[x - 1][y])	a[--x][y] = ++bot;
		while (y < n - 1 && !a[x][y + 1])	a[x][++y] = ++bot;
	}
	for (x = 0; x < n; x++) {
		for (y = 0; y < n; y++)
			printf("%3d", a[x][y]); 
		printf("\n");
	}
	system("pause");
	return 0;
}