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は処理を除外するときにすごい使えるんだなぁと。
これまで考え方は浮かんでいたが実装が浮かばなかった(エラーが出た)。出来たので嬉しい。