# ZeroJudge a867. 7. Minelayer <br> > [題目 : a867. 7. Minelayer](https://zerojudge.tw/ShowProblem?problemid=a867) <br> ## 題目描述 :+1: 在windows中最受歡迎的附屬應用程式莫過於遊戲場中的踩地雷莫屬,現在需要你協助設計一款插件,這款插件可以明確指出盤面中的地雷區域及數量 每個盤面將是隨機產生,你必須將沒有地雷的網格標示出其相鄰的地雷數,如果該網格沒有相鄰的地雷,則以”.”表示 <br> ## 輸入說明 :+1: 每筆測資含一個 ==15 * 30== 的盤面,地雷以 "*" 表示,其餘部份以 "." 表示。 <br> ## 輸出說明 :+1: 輸出該盤面的地雷區域和地雷數目。 <br> ## 範例輸入 :+1: <br> ```cpp= ....................*......**. ...**..*...*.................. ................**.......*.... .........**...*............... ............*.......*......*.. ......*....................*.. .....................*.....*.. ............**.............*.. *.****................*.....*. ...............*.*.**......... ...........................*.. .......*..**.........*...**... ............*........***.*.... ...*.*....*..........*.***.... ...........**........***.....* ``` ## 範例輸出 :+1: <br> ```cpp= ..1221111.111......1*1....1**1 ..1**11*1.1*1..1221111..112221 ..12211122321112**1.....1*1... ........1**212*2221111..11211. .....1111222*211...1*1....2*2. .....1*1...111.....1221...3*3. .....111...1221.....1*1...3*3. 1223321....1**1.....1221..2*31 *2****1....12221212222*1..12*1 1223321.......1*2*2**211..1221 ......1111221.112122321.123*1. ......1*11**21......2*423**21. ..1121211234*1......3***6*41.. ..1*2*1..1*432......3*8***2.11 ..11211..12**1......2***421.1* ``` ## 解題思路 :+1: 1. **讀取輸入**:首先讀取二維陣列的大小為 15 * 30 的元素。 2. **製作答案矩陣** : 我先寫出每一格都是 '.' 的 15 * 30 矩陣( 我叫他 「答案矩陣」 ),然後依照==相鄰是否有地雷==或是==此格是地雷==來覆蓋新的資料到此格。 ( P.S. 如果要在判斷的部分再填入 '.' 而非一開始填入也可以~ ) 4. **找出相鄰的地雷 ( 8個位置 )**:在輸入矩陣的每一個位置,找出其相鄰八個方位是否有地雷,並在計算結果後輸出到答案矩陣中。 5. **輸出結果**:輸出答案矩陣。 ## 程式碼 :+1: ```cpp= #include <iostream> #include <cmath> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); char map[50][50] char ansM[50][50]; // 輸入題目 // 和 // 答案矩陣每一個填入'.' for (int i = 0; i < 15; i++) { for (int j = 0; j < 30; j++) { cin >> map[i][j]; ansM[i][j] = '.'; } } // 宣告等等會用到的八個方位座標 int leftM[8] = { -1 , -1 , -1 , 0 , 0 , 1 , 1 , 1 }; int rightM[8] = { -1 , 0 , 1 , -1 , 1 , -1 , 0 , 1 }; for (int i = 0; i < 15; i++) { for (int j = 0; j < 30; j++) { // 如果此格是'*',則填入'*'就可以 // 跳回迴圈的開頭然後再繼續執行。 if (map[i][j] == '*') { ansM[i][j] = '*'; continue; } // 檢查每一元素的相鄰是否有地雷 int bombs = 0; for (int t = 0; t < 8; t++) { int a = i + leftM[t]; int b = j + rightM[t]; if (a >= 0 && a < 15 && b >= 0 && b < 30) { if (map[a][b] == '*') bombs++; } } if (bombs > 0) ansM[i][j] = char(48 + bombs); } } // 輸出結果 for (int i = 0; i < 15; i++) { for (int j = 0; j < 30; j++) { cout << ansM[i][j]; } cout << endl; } return 0; } ``` ## 成果截圖 :+1: * ![image](https://hackmd.io/_uploads/Hy_yGBUP0.png) <br> ## 心得 :+1: * 第二次寫解題報告,希望可以幫助到人~~