首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言每日小練:蛇形填數矩陣 (螺旋矩陣) 完整解法

     編輯:關於C語言

問題描述

在 n×n 矩陣中 (n ≤ 8),將 1 到 n² 按**順時針螺旋** (右→下→左→上→右...) 填入,從右上角開始向左。輸出矩陣。

範例 n=4:

 10  11  12   1
  9  16  13   2
  8  15  14   3
  7   6   5   4

演算法:方向向量 + 邊界/已填檢測

  • 四個方向:下(1,0)、左(0,-1)、上(-1,0)、右(0,1) — 循環
  • 起始位置:(0, n-1) 右上角
  • 每步嘗試按當前方向前進,若越界或目標已填 → 切換到下一方向

完整 C 代碼

#include <stdio.h>
#include <string.h>

#define MAX_N 8

int main() {
    int n;
    if(scanf("%d", &n) != 1 || n < 1 || n > MAX_N) return 1;
    
    int a[MAX_N][MAX_N];
    memset(a, 0, sizeof(a));
    
    // 方向向量: 下、左、上、右 (順時針)
    int dr[4] = {1, 0, -1, 0};
    int dc[4] = {0, -1, 0, 1};
    
    int r = 0, c = n - 1;  // 起始: 右上角
    int dir = 0;           // 初始方向: 下
    
    for(int val = 1; val <= n * n; val++) {
        a[r][c] = val;
        
        // 計算下一位置
        int nr = r + dr[dir];
        int nc = c + dc[dir];
        
        // 檢查是否需要轉向
        if(nr < 0 || nr >= n || nc < 0 || nc >= n || a[nr][nc] != 0) {
            dir = (dir + 1) % 4;  // 切換方向
            nr = r + dr[dir];
            nc = c + dc[dir];
        }
        
        r = nr; c = nc;
    }
    
    // 輸出
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

關鍵點解析

關鍵點說明
起始位置(0, n-1) 右上角,題目要求
初始方向向下 (dr=1, dc=0)
方向順序下→左→上→右 (順時針螺旋)
轉向條件越界 或 目標已非零
陣列初始化memset 歸零,0 表示未填
輸出格式%4d 對齊,適應 n=8 時最大 64

另一種邊界收縮法 (無需方向陣列)

int top = 0, bottom = n-1, left = 0, right = n-1;
int val = 1;
while(val <= n*n) {
    for(int c = right; c >= left; c--) a[top][c] = val++;  // ←
    if(++top > bottom) break;
    for(int r = top; r <= bottom; r++) a[r][left] = val++;  // ↓
    if(++left > right) break;
    for(int c = left; c <= right; c++) a[bottom][c] = val++; // →
    if(--bottom < top) break;
    for(int r = bottom; r >= top; r--) a[r][right] = val++;  // ↑
    if(--right < left) break;
}

此法通過四個邊界變數收縮,邏輯更直觀,但需仔細處理邊界更新順序。

測試驗證

n=3:
 7  8  1
 6  9  2
 5  4  3

n=5:
 21 22 23 24  1
 20 37 38 25  2
 19 36 41 26  3
 18 35 40 27  4
 17 16 15 14  5

擴展變體

  • 逆時針螺旋:方向順序改為 右→下→左→上
  • 從中心向外:起始 (n/2, n/2),方向 右→上→左→下
  • 矩形矩陣 m×n:邊界收縮法自然支援
  • 輸出路徑座標:記錄每步 (r,c) 而非填數

總結

蛇形/螺旋填數是「方向向量 + 狀態機」或「邊界收縮」兩大經典解法的完美練習題。關鍵在於:正確識別起始點、初始方向、轉向條件、邊界處理。方向向量法通用性強,易擴展至 3D 螺旋、任意路徑追蹤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved