#41649: C++解答(附註解)


a0976828118@gmail.com (Ryan shiun)

學校 : 不指定學校
編號 : 276025
來源 : [118.160.69.87]
最後登入時間 :
2024-08-21 21:39:26
k554. 地雷很危險 -- 小億教學題 | From: [114.44.55.117] | 發表日期 : 2024-08-14 14:53

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    // 用動態陣列初始化
    vector<vector<int>> a(n, vector<int>(m, 0));
    vector<vector<int>> b(n, vector<int>(m, 0));

    // 輸入地雷資料
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }

    // 地雷處理
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            // 1號地雷
            if (a[i][j] == 1) {
                b[i][j] += 1;   // 原格
                // 注意邊界格子需特別處理
                if (j - 1 >= 0) b[i][j-1] += 1; // 左
                if (j + 1 < m) b[i][j+1] += 1;  // 右
                if (i - 1 >= 0) b[i-1][j] += 1; // 上
                if (i + 1 < n) b[i+1][j] += 1;  // 下
            }
            // 2號地雷
            if(a[i][j] == 2) {
                // 列+1
                for (int k = 0; k < m; k++) {
                    b[i][k] += 1;
                }
                // 行+1
                for (int l = 0; l < n; l++) {
                    b[l][j] += 1;
                }
                // 交叉處會重複+1次,所以要-1
                b[i][j] -= 1;
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << b[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
 
ZeroJudge Forum