斯斯有兩種,這裏的地雷也有兩種:
1 號地雷:其爆炸影響的範圍是除了原炸彈的位置外,還有其上下左右各一格。
2 號地雷:其爆炸影響的範圍是除了原炸彈的位置外,還有其上下左右延伸至地圖邊界。
給你一張大小 N*M 地圖,其中有部份地點埋有地雷,如果所在的位置可能會被 1 個地雷炸到,那該位置的被炸風險值就是 1,如果所在的位置可能會被 2 個地雷炸到,那該位置的被炸風險值就是 2,如果所在的位置都不會被炸到,那被炸風險值就是 0。
範例測資
範例輸入 | 範例輸出 |
---|---|
第一行為 N 和 M,代表 N 列 M 行的地圖(1 <= N、M <= 100)。 接下來有 N 列,每列有 M 個數字 (數字 0 表示沒有地雷,數字 1 表示埋有 1 號地雷,數字 2 表示埋有 2 號地雷,數字間以一空白間隔)。 | 請輸出 N*M 地圖中每個位置的被炸風險值,數字間以一空白間隔,請參考範例輸出。 |
4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 |
4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 | 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 |
4 6 0 0 0 1 0 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 | 0 0 3 1 1 0 1 1 2 2 1 2 0 0 2 0 1 1 1 1 2 1 1 2 |
解題思路
將地圖存到一個二維陣列中,並且再宣告一個二維陣列 ans,裡面的資料都預設為 0。
將地圖每一個位置都跑過一遍,並且判斷是否有地雷,根據地雷的種類操作。
如果是 1 號地雷,則將目前位置和其上下左右的 ans 都 +1,需要注意需要判斷上下左右是否會超出 N*M 的邊界。
如果是 2 號地雷,則使用 For迴圈 將上下左右都跑過一次,將一整排的 ans 都 +1。
範例程式碼-ZeroJudge K554: 地雷很危險
#include <iostream>
#include <vector>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N, M, loc[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
cin >> N >> M;
vector<vector<int>>num, ans;
for (int i = 0; i<N; i++) {
vector<int>hi, hii;
for (int j = 0; j<M; j++) {
int tmp;
cin >> tmp;
hi.push_back(tmp);
hii.push_back(0);
}
ans.push_back(hii);
num.push_back(hi);
}
for (int i = 0; i<N; i++) {
for (int j = 0; j<M; j++) {
if (num[i][j] == 1) {
ans[i][j]++;
for (int k = 0; k<4; k++) {
int yy = i+loc[k][0], xx = j+loc[k][1];
if (yy >= 0 && yy < N && xx >= 0 && xx < M) ans[yy][xx]++;
}
continue;
}
if (num[i][j] == 2) {
ans[i][j]++;
for (int k = i-1; k >= 0; k--) ans[k][j]++;
for (int k = i+1; k<N; k++) ans[k][j]++;
for (int k = j-1; k >= 0; k--) ans[i][k]++;
for (int k = j+1; k<M; k++) ans[i][k]++;
}
}
}
for (int i = 0; i<N; i++) {
for (int j = 0; j<M; j++) cout << ans[i][j] << ' ';
cout << "\n";
}
cout << "\n";
}
//ZeroJudge K554
//Dr. SeanXD