ABC075B Minesweeper

Minesweeper

ABC075B Minesweeper
マインスイーパのルールに従って.のマスを数字で置き換えて出力するという問題です。
グリッドの情報処理を学ぶために解きました。


#include <iostream>
#include <vector>
#include <string>

// geschrieben von Beliar698ma

int main(){
  int H, W;
  std::cin >> H >> W;
  
  std::vector<std::string> grid(H);
  for (int i = 0; i < H; i++) std::cin >> grid[i];
  
  //グリッドの各マスの処理
  
  for (int y = 0; y < H; y++) {
    for (int x = 0; x < W; x++) { //各マスへのアクセス
      if (grid[y][x] == '.') { //マスの中身が.だったら以下の処理を行う
        int count = 0; //地雷カウント
        for (int dx = -1; dx < 2; dx++) {
          for (int dy = -1; dy < 2; dy++) { //近傍探索用のループ
            if (dx == 0 && dy == 0) continue; //(0, 0)は自分なので飛ばす
            int xx = x + dx; 
            int yy = y + dy; // (xx, yy)が調査先のマスになる
            if (0 <= xx && xx < W && 0 <= yy && yy < H) { 
              //グリッド境界チェック 境界内であれば以下の処理をする
              if (grid[yy][xx] == '#') count++; 
              //調査先に地雷があれば地雷カウントを増やす
            }
          }
        }
        grid[y][x] = char('0' + count); //自マスを地雷の数で置き換える
      }
    }
  }
  
  for (auto &row : grid) {
    std::cout << row << "\n"; //置き換えられたグリッドを出力
  }
  
}

        

入力例(標準入力)

3 5
.....
.#.#.
.....
        

出力例(標準出力)

11211
1#2#1
11211
        

動作が気になりましたらpaiza.ioなどで上記のコードをテストしてみてください。