zoukankan      html  css  js  c++  java
  • 【Python】生成器、回溯和八皇后问题

    八皇后问题:

      把N个皇后,放在N*N的棋盘上面,从第一行往下放,每个皇后占一行,同时,每个皇后不能处在同一列,对角线上,有多少种放置方法。

    思路:

      典型的回溯问题:

        1.当要放置最后一个皇后时候,默认前N-1个皇后已经全部放置好了,那么验证在第N行上的每个位置是否可行,即是否与之前的皇后在同一列或者对角线即可;

        2.如果放置的不是最后一个皇后,则回溯。回溯至刚开始放第一个元素时候,然后不断的返回上一层。每一层都认为下一层传递给自己的是正确的信息

     1 def isconflict(state, nx):
     2     """
     3     验证下一个要放置的皇后是否与之前的皇后冲突
     4     """
     5     ny = len(state)
     6     for i in range(ny):
     7         if abs(state[i]-nx) in (0, ny-i):
     8             return True
     9     return False
    10 
    11 
    12 def queens(num=8, state=[]):
    13     """
    14     主处理函数
    15     """
    16     for p in range(num):
    17         if not isconflict(state, p):
    18             if len(state) == num-1:
    19                 yield p
    20             else:
    21                 for result in queens(num, state+[p]):
    22                     yield [result, p]
    23 
    24 
    25 def play3(l):
    26     """
    27     把返回的结果列表中的子列表裂解开
    28     """
    29     try:
    30         try: l+''
    31         except TypeError: pass
    32         else: raise TypeError
    33         for i in l:
    34             for s in play3(i):
    35                 yield s
    36     except TypeError:
    37         yield l
    38 
    39 def printqueens(l):
    40     """
    41     打印输出结果
    42     """
    43     l = play3(l)
    44     l = list(l)
    45     n = len(l)
    46     for i in range(n):
    47         for j in range(n):
    48             if j != l[i]:
    49                 print('.', end=' ')
    50             else:
    51                 print('q', end=' ')
    52         print(' ')
    53 
    54 if __name__ == '__main__':
    55     l = list(queens(5))
    56     print(l)
    57     n = len(l)
    58     print('有 {0} 种放置方法:'.format(n))
    59     for i in range(n):
    60         print('--------------------')
    61         printqueens(l[i])
    62         print('--------------------')
  • 相关阅读:
    linux基础——文件的压缩解压缩以及vim编辑
    linux基础——关于chmod用户权限和文件的相关操作
    linux基础的基础命令操作
    操作系统和网络基础之网络协议
    计算机基础
    【python小记】访问mysql数据库
    Qt去掉treeview项的焦点虚线
    嵌入式qt显示中文和隐藏鼠标
    【vim小记】自动保存配置
    重回ubutntu12.04小记(装完ubuntu做的几件事)
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6216460.html
Copyright © 2011-2022 走看看