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"

個数を数える変数 result を $0$ で初期化する。

result: 0

$i=0$ のとき、距離が $1$ 以下である s[0] から s[1] までを調べる。
s[1]G があるので、s[0] は監視されている。
result は変更しない。

$i=1$ のとき、s[0] から s[2] までを調べる。
s[1]G があるので、s[1] は監視されている。
result は変更しない。

$i=2$ のとき、s[1] から s[3] までを調べる。
s[1]G があるので、s[2] は監視されている。
result は変更しない。

$i=3$ のとき、s[2] から s[4] までを調べる。
この範囲に G はないので、s[3] は監視されていない。
result に $1$ 加える。

result: 1

$i=4$ のとき、s[3] から s[5] までを調べる。
s[5]G があるので、s[4] は監視されている。
result は変更しない。

$i=5$ のとき、s[4] から s[6] までを調べる。
s[5]s[6]G があるので、s[5] は監視されている。
result は変更しない。

$i=6$ のとき、s[5] から s[6] までを調べる。
s[5]s[6]G があるので、s[6] は監視されている。
result は変更しない。

最後に、result を出力すればよい。

注意点

特になし。

別解

特になし。