八皇后算法

from itertools import permutations
class Queen():
    def __init__(self,num=8):
        self.num = num
    def putQueen(self):
        xylist=[]
        for group in permutations(range(self.num)):
            xylist.append([(group[i],i) for i in range(self.num)])
        for xygroup in xylist:
            if len(set((xy[0]+xy[1] for xy in xygroup)))==len(set((xy[0]-xy[1] for xy in xygroup)))==self.num:
                yield xygroup
print len(list(Queen().putQueen()))

from itertools import permutations
class Queen():
    def __init__(self,num=8):
        self.num = num
    def putQueen(self):
        for group in permutations(range(self.num)):
            if (self.num == len(set(group[i]+i for i in range(self.num)))== len(set(group[i]-i for i in range(self.num)))):
                yield [(group[i],i) for i in range(self.num)]
print len(list(Queen().putQueen()))  

from itertools import permutations
class Queen():
    def __init__(self,num=8):
        self.num = num
    def putQueen(self):
        for group in permutations(range(self.num)):
            if self.conditions(group):
                yield [(group[i],i) for i in range(self.num)]
    def conditions(self,group):
        for n in range(self.num):
            for m in range(n):
                if abs(group[n]-group[m]) in (0,n-m):
                    return False
        return True
print len(list(Queen().putQueen()))

def queens(num=8,state=()):
    for pos in range(num):
        if not conflict(state,pos):
            if len(state)==num-1:
                yield(pos,)
            else:
                for result in queens(num,state+(pos,)):
                    yield(pos,)+result
def conflict(state,nextX):
    nextY = len(state)
    for i in range(nextY):
        if abs(state[i]-nextX) in (0,nextY-i):
            return True
    return False
print len(list(queens()))

from itertools import permutations
n = 8
cols = range(n)
for vec in permutations(cols):
    if (n == len(set(vec[i]+i for i in cols))== len(set(vec[i]-i for i in cols))):
        print vec


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值