ABC082D - FT Robot
問題概要
二次元平面の原点にロボットがある。ロボットは最初 x 軸の正の向きを向いている。 ロボットは与えられた命令列にしたがって動く。は’F’と’T’のみからなり、それぞれ下記のような操作に対応する。
- ‘F’: 今の向きに移動する。
- ‘T’: 時計回り、または反時計回りに 90 度向きを変える。
命令列を全て実行後、座標(,)にいることができるか判定せよ。
制約
- は’F’と’T’のみからなる。
解法
まずは、操作の選択の余地がある、‘T’の操作について考えてみる。
ロボットは’T’で時計回り、または反時計回りに 90 度向きを変える。つまりどちらに向きが変わっても、今まで x 軸方向を向いていた場合は y 軸方向に、y 軸方向を向いていた場合は x 軸方向に向きが変わるということになる。
ということは、文字列中のある’T’において、次の’T’が出現するまでの’F’の進行方向は、過去にどのようなターンを選択していたとしても x 軸方向、y 軸方向のどちらかに固定される。
例として、FFTTFFFTFTFFFF
というが与えられた場合を考える。この時、最初のFF
はもちろん+x 方向になるが、
次のTT
でどのようなターンの仕方をしたとしても、+x 方向から 0 度、もしくは 180 度のターンとなるため、次のFFF
は+x 方向、もしくは-x 方向になる。次のT
では-90 度もしくは 90 度のターンとなるため、F
は-y 方向もしくは+y 方向となる。このようにして、F
の固まりについて、以下のようにありうる進行方向を絞ることができる。
FF TT FFF T F T FFFF
について
FF
: +xFFF
: +x or -xF
: +y or -yFFFF
: +x or -x
初めのFF
を初期位置が(,)であると読み替えることで無視すると、全ての F のグループを x 軸
に影響するものと y 軸に影響するものに分類できる。この分類操作により、この問題を以下のような問題に置き換えることができる。
変換された問題
ロボットは最初原点(,0)にいる。
集合 と集合 が与えられる。ロボットは集合 から要素を取り出して+x 方向または-x 方向に移動するか、から要素を取り出して+y 方向または-y 方向に移動する。
が空になるまで移動を行った後、座標にいることができるか判定せよ。
変換された問題を解く
変換された問題は、を使ってにぴったり到着できることと、を使ってにぴったり到着できることをそれぞれ独立に考えることができる。しかも、これらは同じ解法で解ける。
を使ってにぴったり到着できるかは、DP により解くことができる。具体的には以下のような DP テーブルを考えればよい。
の要素を最初の i 個使って座標 j に到達できるか
遷移式
( は 論理和 OR を表す)
制約条件から、におさまる。
まとめと感想
この問題を解くには、まずを 1 文字ずつ見て変換問題のための集合を作り()、に到達できることとに到達できることを独立に DP によって解けばよい。()
一見難しそうだがシンプルな複数の問題に分解して解くことができ、解いた後気持ちがよい問題だった。