最近看Python看得都不用tab键了,哈哈。今天看了一个经典问题--八皇后问题,说实话,以前学C、C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的时候碰到的。八皇后问题是说要在一个棋盘上放置8个皇后,但是不能发生战争,皇后们都小心眼,都爱争风吃醋,如果有人和自己在一条线上(水平、垂直、对角线)就会引发撕13大战,所以我们就是要妥当的安排8位娘娘,以保后宫太平。
言归正传,首先,我们得想好解决方案怎么表示,这种事首先想到列表,当然规模小的话用元组最好啦,列表都比较熟悉,这次试试元组。每个元组元素指定相应行皇后位置,如state[0] = 3表示第一行皇后在第4列。然后还要知道什么情况不行,就是说找到矛盾,我们定义一个函数:
def conflict(state,nextx): '定义冲突html" target="_blank">函数,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,哈哈。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Python解决八皇后问题示例,包括了Python解决八皇后问题示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python解决八皇后问题的方法。分享给大家供大家参考,具体如下: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
本文向大家介绍python八皇后问题的解决方法,包括了python八皇后问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了python八皇后问题的解决方法,供大家参考,具体内容如下 题目: 给定一个 N*N 正方形棋盘,在上面放置 N个棋子,又叫皇后,使每两个棋子都不在同一条横线上、竖线上、斜线上。一般我们都讨论8皇后,但是只要N > 4,都会存在解的。 分析: 方法1:根据
本文向大家介绍八皇后问题的相关C++代码解答示例,包括了八皇后问题的相关C++代码解答示例的使用技巧和注意事项,需要的朋友参考一下 八皇后问题即指在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。关键字:递归、上溯.通用技巧: 经观察发现,对8 x 8的二维数组上的某点a[i][j](0<=i,j<=7) 其主对角线(即左上至右下)上的每个点的i-j+7的值
本文向大家介绍Python实现八皇后问题示例代码,包括了Python实现八皇后问题示例代码的使用技巧和注意事项,需要的朋友参考一下 八皇后问题描述 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子。在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进
本文向大家介绍C#用递归算法解决八皇后问题,包括了C#用递归算法解决八皇后问题的使用技巧和注意事项,需要的朋友参考一下 1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走。然后再继续尝试向前。通过
本文向大家介绍python 使用递归回溯完美解决八皇后的问题,包括了python 使用递归回溯完美解决八皇后的问题的使用技巧和注意事项,需要的朋友参考一下 八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法。 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元素代表一行,就能达到要求 任意两个棋子不能在