8クイーン

順列ができたので、「8クイーン」⇒お気楽 Python プログラミング入門:第3回再帰定義と高階関数できるんじゃね?ってことで。
順列のコードにその状態を描画する関数drow()をくっつけた。

def queen(n, pos, m = 0):
    if n == m:
        drow(n, pos)
        pos = []
    else:
        for x in range(1, n+1):
            if x in pos:
                continue
            pos.append(x)
            queen(n, pos, m+1)
            pos.pop()

def drow(n, pos):
    for i in pos:
        for j in range(n):
            if j == i-1:
                print "Q",
            else:
                print "*",
        print
    print

def main():
    queen(4, [])


if __name__ == "__main__":
    main()

結果

D:\workspace\Python\2-29>python test.p
Q * * *
* Q * *
* * Q *
* * * Q

Q * * *
* Q * *
* * * Q
* * Q *

Q * * *
* * Q *
* Q * *
* * * Q

Q * * *
* * Q *
* * * Q
* Q * *

Q * * *
* * * Q
* Q * *
* * Q *

Q * * *
* * * Q
* * Q *
* Q * *

* Q * *
Q * * *
* * Q *
* * * Q

* Q * *
Q * * *
* * * Q
* * Q *

* Q * *
* * Q *
Q * * *
* * * Q

* Q * *
* * Q *
* * * Q
Q * * *

* Q * *
* * * Q
Q * * *
* * Q *

* Q * *
* * * Q
* * Q *
Q * * *

* * Q *
Q * * *
* Q * *
* * * Q

* * Q *
Q * * *
* * * Q
* Q * *

* * Q *
* Q * *
Q * * *
* * * Q

* * Q *
* Q * *
* * * Q
Q * * *

* * Q *
* * * Q
Q * * *
* Q * *

* * Q *
* * * Q
* Q * *
Q * * *

* * * Q
Q * * *
* Q * *
* * Q *

* * * Q
Q * * *
* * Q *
* Q * *

* * * Q
* Q * *
Q * * *
* * Q *

* * * Q
* Q * *
* * Q *
Q * * *

* * * Q
* * Q *
Q * * *
* Q * *

* * * Q
* * Q *
* Q * *
Q * * *

もちろんうまくできてる。
ただ、順列が求まった〜、と言うよりは何倍か楽しい。
それだけ。
ちなみに、これだと4クイーンじゃんって突っ込みはなしで。
8クイーンだと、見せられるほうもつらいでしょ。


これだとあまりにも単純すぎるのでもう少し工夫の余地あり。