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

順時針螺旋列印矩陣:圈層遍歷演算法詳解

     編輯:關於C語言

順時針螺旋列印矩陣:圈層遍歷演算法詳解

題目描述

給定 n 階矩陣,按順時針螺旋順序列印所有元素。
輸入範例(n=4):
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

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

核心思想:圈層遍歷 + 四向展開

將矩陣視為同心圓層,每層由「左→右、上→下、右→左、下→上」四個線段組成。用對角線兩端點 (top, left)、(bottom, right) 界定當前圈層邊界,列印完一圈後向內收縮邊界,直到邊界交錯。

演算法流程圖示

螺旋列印四向展開示意圖

關鍵程式碼

void PrintMatrixSpiral(int **mat, int n) {
    int top = 0, bottom = n - 1, left = 0, right = n - 1;
    while (top <= bottom && left <= right) {
        // 左→右
        for (int j = left; j <= right; ++j) printf("%d ", mat[top][j]);
        // 上→下
        for (int i = top + 1; i <= bottom; ++i) printf("%d ", mat[i][right]);
        // 右→左(需避免重複列印單行/單列)
        if (top < bottom) {
            for (int j = right - 1; j >= left; --j) printf("%d ", mat[bottom][j]);
        }
        // 下→上
        if (left < right) {
            for (int i = bottom - 1; i > top; --i) printf("%d ", mat[i][left]);
        }
        ++top; --bottom; ++left; --right;  // 向內收縮
    }
}

完整測試程式與輸出

int main() {
    int n = 4;
    int mat[4][4] = {{1,2,3,4},{12,13,14,5},{11,16,15,6},{10,9,8,7}};
    PrintMatrixSpiral((int**)mat, n);
    return 0;
}
// 輸出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

程式碼與執行結果截圖

遞迴版本提示

同樣邏輯可寫成尾遞迴:列印外圈 → 遞迴處理內部子矩陣。本質相同,迭代版效能略優且無堆疊溢位風險。

關鍵邊界條件

  • 單行/單列矩陣:第三、四段需加 if 守衛
  • 奇數階矩陣中心單元素:迴圈條件 top<=bottom && left<=right 自然涵蓋

此題是陣列邊界控制與迴圈不變式的經典練習,面試高頻考點。

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