ZeroJudge K554: 地雷很危險

斯斯有兩種,這裏的地雷也有兩種:
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
ZeroJudge K554 範例測資

解題思路

將地圖存到一個二維陣列中,並且再宣告一個二維陣列 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

發佈留言