ABC468 B - Corridor Watch

廊下の監視

考え方

問題の指示通りに、$1$ マスずつ監視下にあるかどうかを調べるだけ。
二重ループの外側のループで候補として各マスを用意し、内側のループでその候補を調べる。

候補を調べるには、自分から左右 $D$ マス以内に G がないことを確認すればよい。
つまり、$i$ マス目の調査のためには、基本的には以下のようにすればよい。

for (int j=i-d; j<=i+d; j++) {
  if (s.at(j)=='G') flag = false;
}

ただし、これだと文字列の外側を見ようとして実行時エラーを起こす。
範囲外にはみ出ないように、以下のように(または別の方法で)工夫すること。

for (int j=max(0,i-d); j<m&&j<=i+d; j++) {
  if (s.at(j)=='G') flag = false;
}

入力例1での動作

入力を受け取る。

m: 7
d: 1
s: ".G...GG"

各位置について、距離が $1$ 以下の範囲に G があるか確認する。

$i$ 調べる範囲 範囲内の G 監視されていないか
$0$ s[0] から s[1] s[1] いいえ
$1$ s[0] から s[2] s[1] いいえ
$2$ s[1] から s[3] s[1] いいえ
$3$ s[2] から s[4] なし はい
$4$ s[3] から s[5] s[5] いいえ
$5$ s[4] から s[6] s[5], s[6] いいえ
$6$ s[5] から s[6] s[5], s[6] いいえ

監視されていないのは $i=3$ の $1$ マスだけなので、答えは $1$ となる。

注意点

特になし。

別解

特になし。