えいとくいん

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行程度で書けるらしいので試してみようと思ったけど、内包表現でリストをきれいに扱えず、とりあえず断念。ねる。