本文主要是给出通过Python回溯法计算八皇后问题,除了在打印结果部分有点麻烦外,计算过程相对简单。
"""
八皇后问题是指如何在一个8X8的棋盘中放置八个皇后,并令他们相互攻击不到对方。也即每一行、每一列和每条斜线上都只有一个皇后。
"""
class Solution():
def solvequeen(self, n):
self.helper([-1]*n, 0, n)
def helper(self, columnpositions, rowindex, n):
"""
:param columnpositions: 摆放皇后的位置
:param rowindex: 行指标
:param n: 总行数
"""
# 全部摆好则直接输出
if rowindex == n:
self.printSolution(columnpositions, n)
return
# 按列给值,如果成立则继续,不成立则给下一个值
for column in range(n):
columnpositions[rowindex] = column
if self.isValid(columnpositions, rowindex):
self.helper(columnpositions, rowindex+1, n)
def isValid(self, columnposition, rowindex):
""" 判断位置是否合法,1.是否同列有;2.检查两天斜杠上是否有一样的"""
for i in range(rowindex):
if columnposition[i] == columnposition[rowindex]:
return False
# 如果在同一斜线上,则横坐标之差与纵坐标之差相同
elif abs(columnposition[i] - columnposition[rowindex]) == rowindex - i:
return False
return True
def printSolution(self, columnposition, n):
for row in range(n):
line = ''
for column in range(n):
if columnposition[row] == column:
line += 'Q '
else:
line += '. '
print(line)
print('*******************************')
Solution().solvequeen(8)
参考文献
《你也能看懂的Python算法书》