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などで上記のコードをテストしてみてください。