Python八皇后问题解答过程详解
2020-02-13 11:44
393 查看
最近看Python看得都不用tab键了,哈哈。今天看了一个经典问题--八皇后问题,说实话,以前学C、C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的时候碰到的。八皇后问题是说要在一个棋盘上放置8个皇后,但是不能发生战争,皇后们都小心眼,都爱争风吃醋,如果有人和自己在一条线上(水平、垂直、对角线)就会引发撕13大战,所以我们就是要妥当的安排8位娘娘,以保后宫太平。
言归正传,首先,我们得想好解决方案怎么表示,这种事首先想到列表,当然规模小的话用元组最好啦,列表都比较熟悉,这次试试元组。每个元组元素指定相应行皇后位置,如state[0] = 3表示第一行皇后在第4列。然后还要知道什么情况不行,就是说找到矛盾,我们定义一个函数:
def conflict(state,nextx): '定义冲突函数,state为元组,nextx为下一个皇后的水平位置,nexty为下一个皇后的垂直位置' 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=()): '八皇后问题,这里num表示规模' for pos in range(num): if not conflict(state,pos):#位置不冲突 if len(state) == num - 1:#若是最后一个皇后,则返回该位置 yield (pos,) else:#若不是最后一个皇后,则将该位置返回到state元组并传给后面的皇后 for result in queens(num,state + (pos,)): yield (pos,) + result
哦,最后的最后,我们还得看看解决方案什么样,定义一个打印函数:
def prettyp(solution): '打印函数' def line(pos,length = len(solution)): '打印一行,皇后位置用X填充,其余用0填充' return 'O'*(pos)+'X'+'O'*(length-pos-1) for pos in solution: print(line(pos))
让我们看看效果:
import random #随机打印一种 prettyp(random.choice(list(queens(8)))) D:\Python34\python.exe D:/Python34/hanshu.py OOOOOOOX OOXOOOOO XOOOOOOO OOOOOXOO OXOOOOOO OOOOXOOO OOOOOOXO OOOXOOOO Process finished with exit code 0
完美达到预期,pass,哈哈。
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- android模拟器(genymotion)+appium+python 框架执行过程中问题解答
- Matlab 与 VC++ 混合编程过程详解(含问题部分解答)
- scikit-learn使用joblib.dump()持久化模型过程中的问题详解--python
- windows7试用过程常见问题解答
- windows7试用过程常见问题解答
- 流动python - 八皇后问题简单解决方案
- Python的开发插件PyDev在Eclipse下的安装过程(解决mylyn的问题in Windows)
- 八皇后问题 - Python - from Python基础教程
- python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题
- python使用过程中遇到的各种奇怪的问题
- python中有关类编写过程中应该主要的一些问题
- python 解决八皇后问题
- Python&MySQL操作过程中遇到的编码问题
- Python+Django开发微信公众号验证通过但微信推送信息接收不到的问题解答
- python中文乱码问题详解
- 安装ffmpeg过程中可能会遇到的问题详解
- python常见问题与解答
- Ubuntu中python环境下import requests错误的解决(学习过程问题记录)
- 八皇后问题、N皇后问题回溯法详解
- python处理网页过程中出现的问题