# 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:
* 
<br>
## 心得 :+1:
* 第二次寫解題報告,希望可以幫助到人~~