ABC111D(ARC103D) - Robot Arms
自力で解いたわけではないですが、かなり勉強になったので解答への筋道をまとめました。
問題概要
平面上の直交座標系の座標(0,0)に工場がある。さらに個の点があり、それぞれ座標は(,),(,),…, (,)である。
工場にロボットアームを導入し、 個の点全てに到達できるようにしたい。
ロボットアームは以下のような仕様である。
- 個の腕と個の関節からなる。最初の関節の座標は工場がある(0,0)。
- 腕には L, R, U, D の 4 つのモードがあり、一つのモードを指定する。
-
腕を 、関節を とした時、腕 は関節とをつないでいる。関節の座標(,)は、腕の長さと指定されたモードにしたがって下記のように定まる。
- ‘L’のとき、(,)
- ‘R’のとき、(,)
- ‘U’のとき、(,)
- ‘D’のとき、(,)
ロボットアームの最後の関節が点に一致している状態をに到達しているという。
個の点全てに到達できるロボットアームが存在するのであれば、そのロボットアームの各腕の長さと、個の点それぞれに到達するためには各アームのモードをどう指定すればいいのかを出力せよ。ただし、腕の数は最大で 40 個である。
制約
- 、
解法
この問題のポイントは以下の3つ。
- そもそも、個の点全てに到達できるようなロボットアームを作れるか
- ロボットアームの各腕の長さはどうすればいいか
- 各点へ到達するための腕のモードはどう決めるか
全ての点に到達できるか
訪れる点について、点に到達できるどのようなロボットアームを用意しても点には到達できないということを確認できれば、不可能と判定することができる。
この判定を行うために、あるロボットアームについて、そのロボットアームで到達できる全ての点に共通する性質を考える。
画像のように、ロボットアームが到達できる全ての点で、ロボットアームの長さの合計は等しい。 つまり、ロボットアームの腕を としたとき、ロボットアームが到達できる点(,)で (は 1 もしくは-1)が成り立つ。
ところで、整数について、とは奇遇が一致するため、ロボットアームが到達できる点(,)全てで、の値は一致することになる。
よって、 個の点のを調べ、全て一致すれば可能、不一致なら不可能となる。
腕の長さはどうすればいいか
実は、問題の入力によらず、上記の条件を満たした個の点全てにたどり着くことができる腕の長さの組み合わせが存在する。結論から述べると、のように 2 の冪乗の長さの腕を用意することで、が腕の長さの総合計以下となる点全てに到達できる。なぜこのようなことが言えるのかみていく。
まずは、長さ 1 の腕が一つだけの場合を見てみる。,,,に到達することができる。
次に長さ 1,2 の腕がある場合を見てみる。
この場合、原点から上下左右に長さ 2 の腕を伸ばし、それぞれの点を基準に上記の「長さ 1 の腕が一つ」の状況を考えれば良い。で、の点全てに到達できていることが分かる。
長さ 1,2,4 の腕がある場合も、で、の点全てに到達できていることが分かる。
同様に 1,2,4,..,と腕を用意することで、で、の点全てに到達することができる。全ての点がの場合は、長さ 1 の腕を一つ付け足せば良い。
制約からなので、からまでの長さの腕があれば全ての点に到達することができる。
腕のモードはどう決めるか
ここまでで、全ての点に到達できることの判定方法、腕の長さの決め方が分かった。あとはある点へ到達するための腕のモードをどのように決めるかを考える必要があるが、これは長い腕から順に考えていくことで解決する。
上図のように、腕で到達できる点の集合は腕で到達できる点の中に内包されており、これは一般的に成り立つ。これを利用すると、腕の長さで到達できるエリアから、最も長い長さ腕で腕で到達できるエリアに動くことができれば長さ の腕のモードを固定できるという事になる。
つまり、中間到達点を最初とおき、最も長い腕を使って点をまだ利用できる腕で到達できるエリアに次々移動させていけば全ての腕のモードが決まる。
例として、点に腕の腕で到達する場合の各腕のモードの決め方を見てみる。
点から長さ 4 の腕で腕のエリアにいくには、長さ 4 の腕の腕で左方向に移動するしかない。これは移動後の座標から長さ 4 の腕のモードを’R’にしたことに当たる。よって、長さ 4 の腕のモードは’R’と決まる。
続いて、点から長さ 4 の腕で移動した点から、長さ 2 の腕で腕のエリアにいくには、長さ 2 の腕で下方向に移動するしかない。先ほどと同様に、長さ 2 の腕のモードは’U’と決まる。
最後に、から原点にいくには長さ 1 の腕を’D’のモードにすればよいので、全ての腕のモードが決定する。
腕の移動方向は、常に中間到達点に対し、が小さくなるように決めていけばよい。これは腕の数だけ操作を行うのでである。
まとめと感想
結局、N 個の点全てに到達可能かを調べ、腕の長さの腕を使って、個の各点についての操作で腕のモードを決めることで解を出力できるので、となる。
2 の冪乗の長さの腕を用意すれば全ての点に到達できるという発想にいくら時間があっても辿り着ける気がしなかったのでとても勉強になった。