6. Python3 解决八皇后问题

暴力搜索法

def conflict(i1,i2,i3,i4,i5,i6,i7,i8):
    x = list(range(8));
    y = [i1,i2,i3,i4,i5,i6,i7,i8];
    for i in range(8):
        for j in range(i+1,8):
            if  (x[i] == x[j]) or (y[i]==y[j]) or (x[i]- y[i] ==x[j]- y[j])  or  (x[i]+ y[i] == x[j]+ y[j]) :
                return  True
            else:
                pass
    return False
            
num = 0;
for i1 in range(8):
    for i2 in range(8):
        for i3 in range(8):
            for i4 in range(8):
                for i5 in range(8):
                    for i6 in range(8):
                        for i7 in range(8):
                            for i8 in range(8):
                                if conflict(i1,i2,i3,i4,i5,i6,i7,i8):
                                    pass
                                else:
                                    num +=1;
                                    print(num,(i1,i2,i3,i4,i5,i6,i7,i8))
  • 共92种方案,其中包括了许多对称结构。
  • 这种很多for循环的方法貌似不是很美观,如果是10皇后,100皇后,无法想象代码会嵌套成什么样子。所以才有了递归的方法

递归的方法

>>> 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
... 
>>> def queens(num =8, state=()):
...     for pos in range(num): # all posible positions for the next queen
...         if not conflict(state,pos): #得到的值不冲突
...             if len(state) == num-1:# The last queen,到达树的叶子节点(第八号值)
...                 yield (pos,)             
...             else: # NOT the last queen, we need try to place the other queens
...                 for result in queens(num, state+(pos,)): 
...                     yield (pos,) + result # 把第i号值 添加到result的前面
... 
>>> print(list(queens(8)))
[(0, 4, 7, 5, 2, 6, 1, 3), (0, 5, 7, 2, 6, 3, 1, 4),...]
  • 这么聪明的方法和简单的代码当然是从书上抄下来的
  • 第八号皇后妥善安置后,才会触发yield语句,最后的for循环才有值,才会触发前面的皇后的yield语句。
  • 将state变量和pos,分开处理,是一个值得学习的东西。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 11,043评论 0 23
  • 小山脚下,有座砖瓦房,成串的玉米挂在横梁上。墙上的红辣椒,和金黄的玉米错落排布,洋溢着浓郁的乡村气息。火热的炕,篱...
    侯玲玉阅读 567评论 0 3
  • 冬意正浓 阴雨连绵的日子爬满了冬天的每个清晨 人们都习惯性地躲进烤火箱 钻进麻将房 也许这是冬季最安逸,悠闲的生活...
    一杯茶水的回忆阅读 275评论 0 0
  • 清晨睁眼就看见小洁发来的信息,她说终于和雷子坦白了,突然很释然,忽然很轻松。 雷子喜欢小洁,这是朋友圈都知道的事,...
    笙秋c阅读 234评论 0 0
  • 用了八个小时粗略读完此书,没什么波澜起伏,情节平淡却也引人入胜,贴合生活,构思巧妙。点评不敢,粗写读完三点感受。 ...
    4ea5ada36edb阅读 486评论 0 0

友情链接更多精彩内容