2013 TCO Marathon Round 2
FragileMirrors
- 鏡をぶっこわせ -
参加メモ
                  yowa (@yowa)
どんな問題?
●
N×Nのマス目に、ナナメ向きの鏡がみっしり
N = 4 の例
(本当は N=50~100)
どんな問題?
● 光線を当てる→反射した直後に鏡が壊れる
←これが
 こうなる→
(6枚破壊)
どんな問題?
● できるだけ少ない手数で、全ての鏡を壊そう!
この図は
2手でいける
やったこと
ビームサーチ
やったこと
ビームサーチ
光線だけに、レーザービームってね!
ご清聴、ありがとうございました
もうちょい詳しく
● 幅優先探索
– ただし全ての解候補ではなく
良さそうな方から k 個だけ保存。
● 「良さそう」って?
●
k っていくつ?
評価関数
● 残りの鏡の数が少ない方が良さそう
● 鏡の数が同じでも、まとまってたほうが良さそう
4手 2手 1手
評価関数
● 残りの枚数と、
●
「壊してしまって空になった列」の数を元に、
てきとーに決めた
k: ビーム幅(解の保持数)
● サイズNのとき、だいたい N 手くらいの解がある
● 一つの局面で有効な手は O(N) 手
●
1手のシミュレーションに、最悪O(N)くらいかかる
● 解を求めるのに O(k N^3) くらいかかりそう
→ k を O(1/N^3) とかにしとけば、
 だいたい決まった時間でおわりそうだぜ
(実際は O(1/N^2.5) くらいにした)
枝刈りとか
●
1手で4枚以下しか壊れなかった
– 出口側から入射でも同じ結果になるのでスキップ
● 枚数少ないからシミュレーション重くないしあんま意味ない
かもだ
● 局面の同一判定とか
– Zobrist Hash をつかった
● 各マスにランダムなhash値を割り当てる
●
(局面のhash値) = (壊したマスのhash値を全部 xor )
所感
● 幅優先だから、時間調節が難しかった
● 高速化はわかんない
vector<int> じゃなく vector<char> にするとか
優先度順に並べるのに partial_sort() するとか
そんくらい(しか知識がない)
小ネタ
時間vsスコアでプロットしてたら…
Nが偶数(上)/Nが奇数(下)、でした
奇数/偶数でわかれる理由
● 特に考察とかは無いです
– 2つに分かれるのに気づいたの
最終提出の2時間前とかだし
– 問題自体がそういうものなのか、
オレのアルゴリズムがそうなってるのか、
それすらわかんない
まとめ
● ビームサーチした
ご清聴、ありがとうございました

2013 TCO Marathon Round 2 (yowa)