美文网首页
6. Python3 解决八皇后问题

6. Python3 解决八皇后问题

作者: 闪电侠悟空 | 来源:发表于2017-07-07 11:46 被阅读0次

暴力搜索法

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,分开处理,是一个值得学习的东西。

相关文章

  • 6. Python3 解决八皇后问题

    暴力搜索法 共92种方案,其中包括了许多对称结构。 这种很多for循环的方法貌似不是很美观,如果是10皇后,100...

  • 《Lua程序设计》-2.八皇后问题

    1.解决八皇后问题,必须认识到每一行只能有一个皇后

  • 利用递归解决八皇后问题

    1.什么是八皇后问题? 游戏的一种,感兴趣的小伙伴可以去玩一下。规则如下:在 8 * 8 的棋盘上,任何两个皇后都...

  • 用JavaScript解决八皇后问题

      八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出...

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 算法(03)回溯

    八皇后问题

  • 生成器

    一个非常棒的递归生成器 利用递归生成器解决八皇后问题

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在...

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

网友评论

      本文标题:6. Python3 解决八皇后问题

      本文链接:https://www.haomeiwen.com/subject/lshlhxtx.html