Nクイーンパズルを解く(2) - 対称性
今日はNクイーンパズルの対称性を検討してみます。
簡単な6クイーンでやってみよう。
ans : 1 ...Q.. Q..... ....Q. .Q.... .....Q ..Q... ans : 2 ....Q. ..Q... Q..... .....Q ...Q.. .Q.... ans : 3 .Q.... ...Q.. .....Q Q..... ..Q... ....Q. ans : 4 ..Q... .....Q .Q.... ....Q. Q..... ...Q..
解は4つ。しかし、どれもおんなじような感じ。
僕が思いついた比較法は、
- 解が見付かったリストを用意しておく。
- 見付かった解のリストを回転、反転して比較。(計8回*見付かったリスト数)
- ユニークならリストに追加。
普通はこうやりそうなモノだけど、解説はすげーテクニック使ってる。
Karetta|Cパズルプログラミング-再帰編|ユニーク解は12個では
- 自分自身を回転、反転させる(計8回)
- 8個の中で一個だけを解とする。(クイーンが一番先に見付かったもの)
- それ以外は無視。
解がユニークであるかどうかは、自分自身を見れば判っちゃう。凄いっす。感動っす。
それを元にコーディングすると、6クイーンの解は一個だけ。
.Q.... ...Q.. .....Q Q..... ..Q... ....Q.
x軸から見ているので、一番先にクイーンが見付かるのはans : 3になります。それ以外は対称性があるので、無視。
まとめ
- 対称性の比較は自分自身を見ればわかる。
感動しました。
パスルの解法は、ans(ans(ans(ans(...))))と再帰的にやっていけば、出るみたいですね。再帰の練習には丁度いい素材です。
次はペグ'ソリティア。限定マスですが、フラッシュゲーム「ペグソリティア」がよくできてます。やぱい。ペグ・ソリティア面白いな ← はまりすぎ。