二維陣列(Two-Dimensional Array)



很常出現在遊戲地圖中的二維陣列↑

先來看看投影片,複習一下一維陣列,並了解二維陣列(介紹陣列投影片)

來寫我們的第一個二維陣列,試著cout<<map[1][2];,結果是什麼?

int ary[2][4] = { //int ary[ 這是row ][ 這是col ]
    {10, 11, 12, 13},
    {14, 15, 16, 17}
};

接著用巢狀迴圈輸出整個陣列

for (int x=0; x<4; x++)
{
    for (int y=0; y<2; y++)
    {
        //輸出的是第二維陣列開頭的記憶體位置
        cout<<ary[y][x]<<endl;
    }
}

二維陣列其實也算是一維陣列嗎?

int ary[2][4] = {
    {10, 11, 12, 13},
    {14, 15, 16, 17}
};
//等同於
int ary[2][4] = { 10, 11, 12, 13, 14, 15, 16, 17};

但是為什麼可以把它看成一維陣列呢?讓我們看看下面這張圖


圖片資料來源↑

二維陣列的其他宣告方式,如下

/* (V) Valid declaration*/
int abc[2][2] = {1, 2, 3 ,4 }
/* (V) Valid declaration*/
int abc[][2] = {1, 2, 3 ,4 }
/* (X) Invalid declaration – you must specify second dimension*/
int abc[][] = {1, 2, 3 ,4 }
/* (X) Invalid because of the same reason mentioned above*/
int abc[2][] = {1, 2, 3 ,4 }

二維陣列中暗藏著記憶體位址

你可以把二維陣列想像成是一條存著多條陣列的一維陣列,聽起來有一點饒舌,不懂的話看看下面圖片,必且將範例程式執行,就會看到我們的一維陣列所存的內容也不完全是陣列,而是陣列的起始記憶體位址。

#include<iostream>
using namespace std;

int main()
{
   int abc[5][4] ={
            {0,1,2,3},
            {4,5,6,7},
            {8,9,10,11},
            {12,13,14,15},
            {16,17,18,19}
            };
    for (int i=0; i<=4; i++)
    {
        //輸出的是第二維陣列開頭的記憶體位置
        cout<<abc[i]<<endl;
    }
    return 0;
}

Two dimensional (2D) arrays in C programming with example


下方課程的補充資料:http://techieme.in/matrix-rotation/

你該學會的包含

轉置二維陣列 - Transpose of a matrix

讓array[i][j]會變成array[j][i]

#include <iostream>
using namespace std;

int main(){

    int rows = 4;
    int cols = 4;

    int ary[rows][cols] = {
     { 1,2,3,4 },
     { 5,6,7,8 },
     { 9,0,1,2 },
     { 3,4,5,6 }
    };

    int i,j,transposed[rows][cols];

    for(i = 0; i < rows; i++){
        for(j = 0; j < cols ;j++)
            cout<<ary[i][j]<<" ";
        cout<<endl;
    }

    for (int i = 0; i <rows; i++) {
        for (int j = 0; j <cols; j++) {
        transposed[i][j] = ary[j][i];
        }
    }

    cout<<endl;

    for(i = 0; i < rows; i++){
         for(j = 0; j < cols ;j++)
            cout<<transposed[i][j]<<" ";
         cout<<endl;
    }
}

Horizontal reflection 跟 Vertical reflection

Vertical reflection Sample Code

#include <iostream>
using namespace std;

int main()
{
    int row = 3;
    int col = 4;

    int arr[row][col] = {
        {1,2,3,4},
        {5,6,7,8},
        {9,9,8,7}
    };
    int mirrorArray[row][col];

    cout << "orginal: " << endl;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }

    // Doing mirror
    for(int i=0; i<row; i++){
        for(int  j=0; j<col; j++)
        {
           mirrorArray[i][j] = arr[row-i-1][j];
        }
    }


    cout << "mirrored: " << endl;
    for(int i=0; i<row; i++){
        for(int  j=0; j<col; j++)
        {
            cout << mirrorArray[i][j] << " " ;
        }
        cout<<endl;
    }

    return 0;
}

順時針與逆時針旋轉 二維陣列

輸入陣列

1 2 3 4
5 6 7 8
9 0 1 2
3 4 5 6

輸出陣列

3 9 5 1
4 0 6 2
5 1 7 3
6 2 8 4

順時針旋轉 = 轉置矩陣 + 垂直鏡像


程式碼實作

#include <iostream>
using namespace std;

int main(){

    int rows = 3;
    int cols = 4;

    int ary[rows][cols] = {
     { 1,2,3,4 },
     { 5,6,7,8 },
     { 9,0,1,2 },
    };

    int i,j,rotated[cols][rows];

    for(i = 0; i < rows; i++){
        for(j = 0; j < cols ;j++)
            cout<<ary[i][j]<<" ";
        cout<<endl;
    }

    for (int i = 0; i <rows; i++) {
        for (int j = 0; j <cols; j++) {
            rotated[j][i] = ary[rows-1-i][j];
        }
    }

    cout<<endl;

    for(i = 0; i < cols; i++){
         for(j = 0; j < rows ;j++)
            cout<<rotated[i][j]<<" ";
         cout<<endl;
    }

}

逆時針旋轉二維陣列

逆針旋轉 = 轉置矩陣 + 水平鏡像

180旋轉二維陣列 - 等於reverse陣列

180旋轉 = 水平鏡像+垂直鏡像


作業

d625: 踩地雷真好玩
https://zerojudge.tw/ShowProblem?problemid=d625

d206: 00108 - Maximum Sum (不用做) https://zerojudge.tw/ShowProblem?problemid=d206

a016: 數獨(SUDOKU) (不用做) https://zerojudge.tw/ShowProblem?problemid=a016


補充教材 - 三維陣列

大看了解一下三維陣列的樣子

習慣上,會把 地位較重要的元素 放在前面。
例如
儲存成績 int grade[第幾間學校][第幾班][幾號學生]
儲存文章 char letter[第幾頁][第幾橫列][第幾個字]

results matching ""

    No results matching ""