二維陣列(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[第幾頁][第幾橫列][第幾個字]