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$ となる。
注意点
特になし。
別解
特になし。