Python实现八皇后问题示例代码
简介
八皇后问题是一个经典的算法问题,目的是在一个8x8的棋盘上放置8个皇后,使得每个皇后都无法攻击到其他皇后。其中,皇后可以攻击处于同一行、同一列或同一对角线上的棋子。
Python作为一门高级编程语言,非常适合用于解决棋类问题。本文将介绍如何使用Python编写八皇后问题的代码,力求让读者能够完整理解八皇后问题,并用Python实现求解。
八皇后问题的求解过程
下面介绍八皇后问题的一种解法,这种解法使用了回溯算法。
-
确定程序的输入输出。
输入:无
输出:8x8的棋盘上的8个皇后的位置。
-
初始化棋盘。
在这个问题中,我们需要一个8x8的棋盘来表示皇后的位置。可以使用一个二维数组来表示棋盘。这个二维数组的每个元素表示棋盘上的一个点,1表示有皇后,0表示没有。
-
填充棋盘。
我们从第一列开始摆放皇后,从上到下尝试逐个放置皇后。
对于每个可放置皇后的位置,我们都要进行如下操作:
- 将该位置标记为已有皇后。
- 判断当前填充是否符合要求。
- 如果符合要求,进入下一列继续填充皇后。
- 如果不符合要求,回溯到上一列,重新尝试摆放皇后。直到所有的尝试都失败,回溯到倒数第二列,重新开始尝试。
-
判断填充情况。
如果所有的列都已经填充完毕,则该问题已经解决,返回结果;否则继续回溯。
代码实现
下面是Python的实现代码:
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
# 初始化棋盘
grid = [['.' for _ in range(n)] for _ in range(n)]
res = []
# 从第一列开始,且从第0行开始尝试
self.backtrack(grid, 0, res)
return res
def backtrack(self, grid: List[List[str]], col: int, res: List[List[str]]):
if col == len(grid):
res.append([''.join(row) for row in grid])
return
# 枚举该列中可填位置的行
for row in range(len(grid)):
if self.isValid(grid, row, col):
# 将该位置标记为已有皇后
grid[row][col] = 'Q'
# 在下一列中继续填充皇后
self.backtrack(grid, col+1, res)
# 回溯到上一列
grid[row][col] = '.'
def isValid(self, grid: List[List[str]], row: int, col: int) -> bool:
# 判断纵向是否合法
for i in range(col):
if grid[row][i] == 'Q':
return False
# 判断左上方是否合法
for i,j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):
if grid[i][j] == 'Q':
return False
# 判断右上方是否合法
for i,j in zip(range(row-1, -1, -1), range(col+1, len(grid))):
if grid[i][j] == 'Q':
return False
return True
上面这段代码使用了Python的回溯算法来解决八皇后问题。通过具体的代码实现,很容易理解八皇后问题的求解过程。
示例说明
示例1:
输入:
n = 4
输出:
[
[".Q..",
"...Q",
"Q...",
"..Q."],
["..Q.",
"Q...",
"...Q",
".Q.."]
]
示例2:
输入:
n = 1
输出:
[
["Q"]
]
这两个示例说明了本文提供的解法可以解决八皇后问题,并能够输出正确结果。本文中使用Python编写代码,而Python具有代码简洁、易读、易维护等特点,所以非常适合用于算法问题的解决。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现八皇后问题示例代码 - Python技术站