蛇形填數(螺旋矩陣)是經典算法訓練題:在 N×N 矩陣中按順時針螺旋順序填入 1..N²。本文給出簡潔 C 實現,核心思路「右→下→左→上」四個 while 迴圈交替推進,邊界條件為 下一格未越界且未被填寫。
a[N][N] = {0},起點 (0,0) 填 1。num < N*N 循環:while (j+1 < N && a[i][j+1]==0) a[i][++j] = ++num;while (i+1 < N && a[i+1][j]==0) a[++i][j] = ++num;while (j-1 >= 0 && a[i][j-1]==0) a[i][--j] = ++num;while (i-1 >= 0 && a[i-1][j]==0) a[--i][j] = ++num;#include#include int a[10][10]; // 假設 N ≤ 10 int main() { int i, j, n, num = 0; memset(a, 0, sizeof(a)); scanf("%d", &n); num = a[i=0][j=0] = 1; while (num < n*n) { while (j+1 < n && a[i][j+1] == 0) a[i][++j] = ++num; // 右 while (i+1 < n && a[i+1][j] == 0) a[++i][j] = ++num; // 下 while (j-1 >= 0 && a[i][j-1] == 0) a[i][--j] = ++num; // 左 while (i-1 >= 0 && a[i-1][j] == 0) a[--i][j] = ++num; // 上 } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d ", a[i][j]); } printf("\n"); } return 0; }
j+1 < n 防越界,a[i][j+1]==0 防重寫。++j、--i 等前綴運算緊湊高效。num == n*n 時四個方向均無法推進,循環自然結束。j==n-1。dx[4]={0,1,0,-1}, dy[4]={1,0,-1,0} 統一四方向邏輯,減少重複代碼。蛇形填數通過「邊界+已訪問」雙重檢查驅動方向轉向,代碼極短卻完美演示狀態機思想。掌握此模板,可輕鬆應對螺旋矩陣遍歷、生成、路徑查找等變體題目。