Pocalaメモ

アウトプット用のなにか

ABC096 C - Grid Repainting 2

atcoder.jp
実装がメイン(?)の問題。

上下左右に隣接する2つの黒マスなら同時に塗れる→上下左右に黒マスがなかったら、目標を達成することができない

# .
. # ←無理

全てのマスを見ていって、「#」を見つけたらそこのマスの上下左右を確認して、「#」があれば塗れるということになる。

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

int main() {
  int h, w;
  cin >> h >> w;

  string G[h];
  for (int i = 0; i < h; i++) cin >> G[i];

  const int dy[4] = {-1, 0, 0, 1};
  const int dx[4] = {0, -1, 1, 0};

  bool can = true;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (G[i][j] == '#') {
        bool sharp = false;
        for (int d = 0; d < 4; d++) {
          if (i + dy[d] < 0 || h <= i + dy[d]) continue;
          if (j + dx[d] < 0 || w <= j + dx[d]) continue;
          if (G[i + dy[d]][j + dx[d]] == '#') sharp = true;
        }
        if (sharp == false) can = false;
      }
    }
  }

  if (can)
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
}

https://img.atcoder.jp/abc075/editorial.pdf
ABC075のB問題の解説にある実装方法は、わかりやすくて良いなと思ったのでCの方でも使ってみました。continueは処理を除外するときにすごい使えるんだなぁと。

これまで考え方は浮かんでいたが実装が浮かばなかった(エラーが出た)。出来たので嬉しい。