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 を出力すればよい。
注意点
特になし。
別解
特になし。