競技プログラミングのためのF#入門
1 2 3 |
|
文字列間の距離をL^1
距離(マンハッタン距離)で表して考えます. 特に(R,B,W)
で原点からの距離を表すと, 初期値は原点からの距離がN
で, そこからL^1
距離を1ずつ減らして目標地点((1,0,0),(0,1,0),(0,0,1)
のどれか)に到達できるかが問題です.
次に文字の変換を距離で解釈します. 名前があると便利なため, それぞれの変換に番号をつけます.
WW - W
: W-1
移動WR - R
: W-1
移動WB - B
: W-1
移動RR - B
: R-2,B+1
移動BB - W
: B-2,W+1
移動RB - W
: 立方体の対角線上の移動でR-1, B-1, W+1
いずれにせよステップごとに原点からのL^1
距離は1ずつ減ります. ある時点での距離L
を別に記録して状態を(R,B)
だけで考えると, 注目すべきは上記の2,3,6
です. 特に直線R-B=k
上で考えると, 6
は直線上の移動で, 2,3
はk ± 3
移動します. 三つつのゴールはそれぞれk=1,-1,0
にあたるため, 初期位置からk
を±3
して目標に位置合わせできるなら"Yes"
です. 特に(R-B)%3
の値がそれぞれ1,2,0
のどれになるかが問題です.
アルゴリズムさえ考えられれば, あとは各文字を数値に変換して計算すれば終わりです.
1 2 3 4 5 6 7 |
|