用python解决八皇后问题

八皇后问题:有一个棋盘和8个要放到上面的皇后。唯一的要求是皇后之间不能造成威胁(即皇后两两不能在同一行、同一列、同一斜线上),如何用python来解决八皇后问题?

这是一个经典回溯问题:首先放置第1个皇后(第一行),然后放置第2个,以此类推。如果发现不能放置下一个皇后后,就回溯到上一步,试着将皇后放到其他的位置。最后,尝试完所有可能找到的解决方案。

python代码:

#寻找冲突
#已知的皇后位置被传递给conflict函数(以状态元组的形式)
#然后由函数判断下一个的皇后位置会不会有新的冲突
def conflict(state,nextX):
	nextY=len(state)
	for i in range(nextY):
		if abs(state[i]-nextX) in (0,nextY-i): #如果下一个皇后和正在考虑的前一个皇后的水平距离为0或者等于垂直距离就返回True
			return True
	return False

def queens(num=8,state=()):
	for pos in range(num):
			if not conflict(state,pos):
				if len(state)==num-1: #如果只剩一个皇后没位置,遍历所有可能位置,返回无冲突发生的位置
					yield (pos,)
				else: #把当前的位置信息添加到元组并传递给后面的皇后
					for result in queens(num,state+(pos,)): #递归
						yield(pos,)+result
print(list(queens(4))) #以列表形式返回位置,4*4的棋盘,4个皇后
for solution in queens(8): 
	print(solution) #列出8皇后所有可能性
print(len(list(queens(8)))) #列出方案个

#附:输出更容易看
def prettyprint(solution):
	def line(pos,lenth=len(solution)):
		return '.'*(pos)+'X'+'.'*(lenth-pos-1)
	for pos in solution:
		print(line(pos))
import random #导包,choice函数
prettyprint(random.choice(list(queens(8)))) #随机打印一个以'.''X'来表示棋盘和皇后的方案

运行结果:

[(1, 3, 0, 2), (2, 0, 3, 1)]

(0, 4, 7, 5, 2, 6, 1, 3)
(0, 5, 7, 2, 6, 3, 1, 4)

(7, 2, 0, 5, 1, 4, 6, 3)
(7, 3, 0, 2, 5, 1, 6, 4)

92

…X…
.X…
…X.
…X…
…X…
…X
…X…
X…

最后…

本人初学python,希望喜欢python的朋友可以多多交流,感谢。

猜你喜欢

转载自blog.csdn.net/NYSM239/article/details/98629473
今日推荐