旗門番号決定アルゴリズムについて

スラロームの旗門の番号の決め方
http://d.hatena.ne.jp/merrilin/20090607/1244380177

さて、pencilboxにスラロームが追加されましたが、
上の記事でも書いてあるように、従来のぱずぷれは旗門に対して番号を入力していたのですが
pencilnoxでは黒マスに数字を入力している、と言う風になっていました。
 
実際、元々のぱずぷれでもこれが制限事項になっていて
考慮漏れでうまくいかなくなるパターンがあったので、
pencilboxのように、数字に黒マスを入力する方法に変えてみました。
 
ただ、上に書いてあるリンク先にpencilboxも旗門番号決定方法が書いてあるっぽいのですが
例によって自己流でぱずぷれv3のルーチン作ったらかなり別物になっていたので
取り敢えず、今回はその方法を書いてみたいと思います。
 
この方法は、1つの旗門に繋がる黒マスが最大2つであることを利用しています。

  1. 黒マスの数字を、その黒マスに繋がる旗門に保持しておく
  2. 旗門の保持する数字が2つで同じ場合、無条件で(複数あっても)その数字を旗門に割り当てる
  3. 2.で割り振られた数字を全ての場所から取り除く
  4. 旗門の保持する数字が一つで、同じ数字で他に同様の場所がない場合はその数字を旗門に割り当てる
  5. 4.で割り振られた数字を全ての場所から取り除く
  6. 4.-5.でどこかの旗門の番号が決定した場合、4に戻る
  7. どこかに一つしか存在しない数字があった場合、その数字を旗門に割り当てる
  8. 7.で割り振られた数字を全ての場所から取り除く
  9. 7.-8.でどこかの旗門の番号が決定した場合、4に戻る

7-9は、このブログにあるスラローム[No.03]がうまくいかなかったので追加しました。。
と言っても、ただ文書で書いただけでは分かりそうにないので
ちょっと図をつけて説明してみたいと思います。
 

ちょっとこの問題を例にとってみたいと思います。
(この問題自体は成り立っていません)


1.で黒マスからそれに繋がる旗門に数字を伝播させます。
1つの旗門が持つ数字は最大2つになるはず。


2つの同じ数字を持つ旗門があったら、
その番号を旗門に割り振ります。
つまり、この例だと3の場所が決まります。
さらに、別の旗門が持つ3の数字も全て消してしまいます。
この例にはありませんが、離れていても一緒です。


4.により、1がくっついている場所が1つしかないので
1の場所が決まります。なお、[1][1,2][1,4]とかがあっても、
[1]が1カ所ならその場所が1になって、他の旗門が持つ
1の数字は全て消えます。
この後、もういつど4.を見ますが、[2]が2ヶ所あるので
これは決まらず、7.に進みます。


7.で5に着目すると、5の数字がくっついている場所が
1ヶ所しかないので、その場所を5に決定します。
なお、この場合[4,5]の4も巻き添えで一緒に消えます。
ちなみに、[2,5][4,5]とか5が2ヶ所あったらスルーされます。


4.まで戻った後、4.-6.では決まらず、7に進みます。
先ほどと同様に旗門の番号が4と決まります。


4.に戻りますが、結局2は決まらないので、
そのまま終了になります。

 
Xキー押したら確かめられるので、お時間があったら確かめてみてください。
っていうか、黒マスに入力する方に変えたら、
かなりいろいろなところのルーチンがすっきりしたような気がします。
 
外枠に向かって伸びる旗門の優先順位が低めとか、そういう難点はありますが
これで変になるようなら人間でも判別が困難な問題に
なっていると思うのですが、どうでしょう。。
 
あと、途中まで書いててブラウザが強制終了するとか鬼畜でした。。