八皇后的python实现

最后想学习一下python,整点啥呢。偶尔在百度看到八皇后的问题,本来挺不愿意整这些算法的

当学新语言了


__author__ = 'gaochenghao'


class EightQueen:
    #define const  queen number
    queenNum = 8
    def __init__(self):
        #定义一个8行 8 列的二维数组来模拟棋盘
        self.qiPan = []
        self.num = 0
        #init a n*n  list[][] as qi pan
        for i in range(self.queenNum):
            rows = []
            for j in range(self.queenNum):
                xy = [i,j]
                rows.append(xy)
            self.qiPan.append(rows)
    #定义一个递归方法,递归去下一行寻找符合条件的坐标点

    #param e8  存放符合条件的坐标点的列表

    #param rowNum   寻找的行号
    def getNext(self,e8,rowNum):
         if len(e8) == self.queenNum:
            self.num += 1
            #输出符合条件的全部坐标点
            print "method "+str(self.num)+"is:"+str(e8)
            return
         if rowNum > len(self.qiPan):
             return
         for d in self.qiPan[rowNum]:
             if self.matchAllE8(e8,d):
                 e8copy = e8[:]
                 e8copy.append(d)
                 self.getNext(e8copy,rowNum+1)

    def calcNum(self):

        #遍历棋盘的第一行
        for i in self.qiPan[0]:

            #从第二行开始递归寻找符合条件的坐标
            self.getNext([i],1)
        print "all method is:"+str(self.num)

   #判断left0坐标 是否满足上面行中已找到的全部符合条件的坐标都不攻击
    def matchAllE8(self,e8,left0):
        for i in e8:
            if not self.isMatch(i,left0):
                return False
        return True


    # 符合不攻击的条件
    def isMatch(self,f,g):
        return (f[0]+f[1] != g[0]+g[1]) and\
               (f[0]-f[1] != g[0]-g[1])  and\
               (f[0] != g[0]) and (f[1] != g[1])

e = EightQueen()

e.calcNum()



这是同事的解法二

__author__ = 'yfhuangfei'

def attack(p1,p2):
    return p1[0]==p2[0] or p1[1] == p2[1] or (abs(p1[0]-p2[0])==abs(p1[1]-p2[1]))

class Cell():
    def __init__(self,n):
        self.n = n
        self.cell = [[(i,j) for j in range(n)] for i in range(n)]

def isAttack(p,rp):
    for i in rp:
        if attack(p,i):
            return True
    return False

def eightQueen(num):
    cell = Cell(num)
    board = cell.cell
    result = [[(0,i)] for i in range(num)]
    count = 0
    for col in board:
        count+=1
        for p in col:
            if not result:
                result.append([p])
            else:
                #scan the result
                for rp in result:
                    if  not isAttack(p,rp):
                        copy = rp[:]
                        copy.append(p)
                        result.append(copy)
        result = filter(lambda x: x.__len__()==count,result)
    return filter(lambda x : x.__len__()==num,result)

result = eightQueen(9)















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值