蛇形填數問題
阿新 • • 發佈:2018-11-25
題目描述
在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; }