Python八皇后问题解答过程详解
最近看Python看得都不用tab键了,哈哈。今天看了一个经典问题--八皇后问题,说实话,以前学C、C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的时候碰到的。八皇后问题是说要在一个棋盘上放置8个皇后,但是不能发生战争,皇后们都小心眼,都爱争风吃醋,如果有人和自己在一条线上(水平、垂直、对角线)就会引发撕13大战,所以我们就是要妥当的安排8位娘娘,以保后宫太平。
言归正传,首先,我们得想好解决方案怎么表示,这种事首先想到列表,当然规模小的话用元组最好啦,列表都比较熟悉,这次试试元组。每个元组元素指定相应行皇后位置,如state[0]=3表示第一行皇后在第4列。然后还要知道什么情况不行,就是说找到矛盾,我们定义一个函数:
defconflict(state,nextx): '定义冲突函数,state为元组,nextx为下一个皇后的水平位置,nexty为下一个皇后的垂直位置' nexty=len(state) foriinrange(nexty): ifabs(state[i]-nextx)in(0,nexty-i):#若下一个皇后和前面的皇后列相同或者在一条对角线上,则冲突 returnTrue returnFalse
最后,我们要解决娘娘们的位置了,先找到一个不冲突的位置,如果这位娘娘是最后一位,那么我们就把娘娘们安排好了,返回该位置到解决方案;如果不是最后一位,也把该位置信息返回到状态元组(最后的解决方案是含全部位置信息的状态元组)并传给后面的皇后,看代码:
defqueens(num=8,state=()): '八皇后问题,这里num表示规模' forposinrange(num): ifnotconflict(state,pos):#位置不冲突 iflen(state)==num-1:#若是最后一个皇后,则返回该位置 yield(pos,) else:#若不是最后一个皇后,则将该位置返回到state元组并传给后面的皇后 forresultinqueens(num,state+(pos,)): yield(pos,)+result
哦,最后的最后,我们还得看看解决方案什么样,定义一个打印函数:
defprettyp(solution): '打印函数' defline(pos,length=len(solution)): '打印一行,皇后位置用X填充,其余用0填充' return'O'*(pos)+'X'+'O'*(length-pos-1) forposinsolution: print(line(pos))
让我们看看效果:
importrandom #随机打印一种 prettyp(random.choice(list(queens(8)))) D:\Python34\python.exeD:/Python34/hanshu.py OOOOOOOX OOXOOOOO XOOOOOOO OOOOOXOO OXOOOOOO OOOOXOOO OOOOOOXO OOOXOOOO Processfinishedwithexitcode0
完美达到预期,pass,哈哈。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
热门推荐
10 婚礼酒祝福语简短大气
11 市场经理生日祝福语简短
12 生日宴祝福语 简短独特
13 孩子新年祝福语简短精辟
14 早上祝福语简短句子
15 破五祝福语简短的
16 学校生日祝福语简短独特
17 医美的祝福语大全简短
18 妈妈的中考祝福语简短