えいとくいん
import copy def print_table(tbl, maxrow): print "########" for i in xrange(maxrow+1): outstr = "" for j in xrange(maxrow+1): if tbl[i] == j: outstr += "@" else: outstr += "-" print outstr def e_queen(tbl, maxrow, row, okaycols): for i in xrange(maxrow - row + 1): x = copy.deepcopy(okaycols) dat = x.pop(i) tbl.append(dat) if row != maxrow: e_queen(tbl, maxrow, row+1, x) tbl.pop() else: naname_a = {} naname_b = {} for j in xrange(maxrow+1): a = j+tbl[j] b = j-tbl[j] if naname_a.has_key(a) or naname_b.has_key(b): ng = 1 break else: ng = 0 naname_a[a] = 1 naname_b[b] = 1 if not ng: print_table(tbl, maxrow) tbl.pop() e_queen([],7,0,range(8))
辞書やらディープコピーやら、とにかくリソースを使えるだけ使った、ゴテゴテで汚い感じのコード。引数が多いわりに破壊的だったりする。ひどい。
Haskellでは内包表現を使って10行程度で書けるらしいので試してみようと思ったけど、内包表現でリストをきれいに扱えず、とりあえず断念。ねる。