| ■ ルールの補足説明 |
| ■ ソルバー開発の方針 |
| ■ 本線について |
| 本線は進行方向を180度転換する動きはしない。ただし、本線が交差することは有り得る。 |
| ■ 穴埋めについて |
|
方法1「2つの島の間を往復してそれぞれの島の1マスずつを塗りつぶす。」 方法2「マスの数が偶数個の島ならその島単独で塗りつぶすことが出来る。」 |
| ■ 穴埋めの消費ステップ数 |
※※※※※※※※※※※※ ※※※※※※※※※※※※ ※※※※口※※口※※※※ ※●●●●●●●●●●※ ※※※※※※※※※※※※方法1: 5(距離)×2=10step 「2つの島の距離×2」 |
※※※※※※※※※※※※ ※※※※※口※※※※※※ ※※※※※口※※※※※※ ※●●●●●●●●●●※ ※※※※※※※※※※※※方法2: 6step (ただし、2つの空きマスの内 どちらかでも本線が通過したことがあれば2step) |
※※※※※※※※※※※※ ※※※※口口口※※※※※ ※※※※※口※※※※※※ ※●●●●●●●●●●※ ※※※※※※※※※※※※方法2+1: 6+4=10step (方法2を適用すると 島が分断され、残りは方法1により4step消費) |
| ■ 解の表示形式 |
※※※※※※※※※※※※※※※ ※※※※※┌────┐※※※※ ※※※┌─┘※※A※│※※※※ ※┌─┘※口口A┌─┘※※※※ ※│※@口口※※│※※┌─┐※ ※└─┐※※┌─田田─┘※│※ ※※※│※※│※※│※┌─┘※ ※※※E※※│※※│※│※※※ ※※※@S─┘※※└─┘※※※ ※※※※※※※※※※※※※※※ |
| ■ 本線の終着点 |
ここから先の話は明確な理論というよりも、おそらくそんなもんだろうという話になるのですが、ドーナツ状のループした島がまだ残っている場合は本線を終了させるには早すぎます。2マス消すのに6ステップも消費するような穴埋めをするよりも、ドーナツ状の島は本線を通過させて埋めていった方がずっと得策だと思われるからです。
同様の理由により、すぐ目の前に連続した未通過空きマスが2つ以上続いている場合も本線を終了させるには早すぎるだろう、、、と思ったのですが、それは早とちりでした。下のようなケース(第302面)があるので3つ以上続いている場合は本線を終了させるには早すぎると改めました。(←かなりいい加減)
※※※※※※※※※※※※※※※ ※※※※※※┌─┐※※※※※※ ※※※※※┌┘※└┐※※※※※ ※※※※┌┘※※※└┐※※※※ ※┌──┘※※※※※└──┐※ ※│※※A※※※※※@※※│※ ※└──┐※※※※※┌──┘※ ※※※※└E※※※┌┘※※※※ ※※※※※A@S─┘※※※※※ ※※※※※※※※※※※※※※※ |
| ■ 本線探索の枝刈り |
| 現在の消費ステップ数 + 現在の空きマス数 > 制限歩数 |
| ■ プログラミング |
尚、このページでの説明は主要な部分だけを書きました。実際にはかなり細かい部分にまで様々なアイデアを投入しないと全問制覇は困難かと思われます。そういった部分に関してはここでは触れませんし質問されてもお答えできません。
| ■ 実行結果 |
|
CPU = AMD Athlon 1.0GHz メモリ = 128MB (PC133,CL=3) O S = Windows Me (DOS窓) コンパイラ=Visual C++ 5.0 (実行速度で最適化) |
|
【実行結果表の見かた】 面番号:本線ステップ数+穴埋めステップ数=合計ステップ数 (制限歩数)/本線探索消費バケット数 穴埋め探索を試みた回数 実行時間(秒) 尚、合計ステップ数の後ろに「★」のあるものは制限歩数を更新したものです。 |
| ■ おわりに |
| ■ 追記(2002/04/26) |
|
−−−−【としひでさんの説明に加筆】−−−−
盤面に白黒の市松模様を付けます。終着点が白マスだったとして、−1歩では白マスの偶奇性が反転します。かと言って−2歩で白マスの偶奇を元に戻すことは出来ません。何故なら移動経路は必ず「黒白黒白…」と交互に辿るので−2歩では黒マスの偶奇性を反転させる結果になってしまいます。従って、これらの偶奇を元に戻すにはさらに−2歩を必要とし、結局4ステップ単位でしか歩数を更新することは出来ない。 |
|
XOR開発チームによる「XORの法則」 |