Skip to main content

5.3 多維陣列

二維陣列

把索引值擴展為 2 維,我們就可以得到二維陣列。

一個大小為 m x n 的二維陣列,可以這樣宣告。

// 宣告一個 4 x 6 的 int 二維陣列
int A[4][6];

和一維陣列一樣,可以在宣告時給定初值。

int A[4][6] = {
  {1, 2, 3, 4, 5, 6},
  {5, 12, 7, 11, 9, 8},
  {10, 21, 13, 22, 23, 16},
  {4, 78, 13, 45, 51, 11}
};

搭配雙層迴圈遍歷其值

我們可以使用雙層迴圈,把前面那個二維陣列的值印出來。

for(int i=0; i<4; i++) {
  for(int j=0; j<6; j++) {
    cout << A[i][j] << " ";
  }
  cout << endl;
}
1 2 3 4 5 6 5 12 7 11 9 8 10 21 13 22 23 16 4 78 13 45 51 11
練習:2D 地圖

給定一張 m x n 大小的地圖,以及各地貌的代表數字,請輸出該地圖。

$ 1 \le m, n \le 100 $

輸入說明:

第一行是兩個正整數 m n,表示陣列的 列數(row)、行數(column)。

接下來是共 m 列,每列有 n 個整數的地圖資訊,表示該位置的地貌代碼。

接著是一個整數 k,表示有 k 種地貌。

最後是 k 列,每列為一個整數 i 與一個字元 c,表示代碼 i 的地貌為 c。

輸出說明:

輸出該地圖的地貌,如範例輸出。

範例輸入:

3 4 1 1 1 1 2 2 0 1 1 2 0 1 3 0 _ 1 # 2 *

範例輸出:

#### **_# #*_#

#include <iostream>

using namespace std;

int main()
{
    int m, n;
    cin >> m >> n;
    
    int M[100][100];  // 這樣比較安全,若 size 太大可考慮宣告在全域區
    // int M[m][n];   // C99 的 VLA 允許這麼宣告,但是若 size 太大會有問題
    
    for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++) {
            cin >> M[i][j];
        }
    }
    
    int k;
    cin >> k;
    int N[k];    // 地貌代碼
    char T[k];   // 地貌
    
    for(int i=0; i<k; i++) {
        cin >> N[i] >> T[i];
    }

    for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++) {
            for(int u=0; u<k; u++) {
                if(M[i][j]==N[u]) {    // 在 N 中找出代碼 M[i][j] 的位置 u
                    cout << T[u];      // 輸出地貌 T[u]
                    break;
                }
            }
        }
        cout << endl;
    }

    return 0;
}

多維陣列

如果把二維陣列想像成一個平面,那麼三維陣列就可以想像成一個長方體。

平常我們很少使用超過 3 維的陣列,除非你很確定自己需要,否則在你宣告一個大於 3 維的陣列之前,可以想一想,有沒有更好的方式可以不要用到這麼高維的陣列。