算法题:N皇后
is_valid
函数来检查某个皇后的位置是否合法。我们需要确保这个位置不与之前的任何一个皇后冲突。检查的方法是:确保该列没有其他皇后,确保两个斜对角线的位置不冲突。def solveNQueens(N):
# 存储结果的列表
solutions = []
# 当前棋盘的状态
board = [-1] * N
def is_valid(row, col):
for i in range(row):
# 检查列是否冲突,检查斜对角线是否冲突
if board[i] == col or abs(board[i] - col) == row - i:
return False
return True
def backtrack(row):
# 如果已经摆放了 N 个皇后
if row == N:
solutions.append(["." * i + "Q" + "." * (N - i - 1) for i in board])
return
# 尝试将皇后放在当前行的每一列
for col in range(N):
if is_valid(row, col):
board[row] = col
backtrack(row + 1)
board[row] = -1 # 回溯
# 从第一行开始摆放皇后
backtrack(0)
return solutions
# 测试
N = 4
results = solveNQueens(N)
for solution in results:
for row in solution:
print(row)
print()
代码解析:
board
数组:我们用一个长度为 N 的数组来表示棋盘的状态。数组的每个元素代表当前行上皇后所在的列。例如,board[i] = j
表示第 i 行的皇后放在第 j 列。** is_valid(row, col)
**:这个函数用来检查我们放置皇后的位置是否合法。它会检查同列上是否有其他皇后,以及是否与已放置的皇后在斜对角线上有冲突。** backtrack(row)
**:回溯函数,尝试在当前行的每一列放置皇后。如果某个位置有效,就递归进入下一行。如果成功放置了 N 个皇后,就将当前的棋盘配置存储到solutions
列表中。否则,回溯到上一步,尝试其他可能的放置位置。** solveNQueens(N)
**:主函数,接受一个整数 N,表示棋盘的大小,并返回所有可能的皇后摆放方案。
运行结果:
N = 4
,输出将是:. Q . .
. . . Q
Q . . .
. . Q .
. . Q .
Q . . .
. . . Q
. Q . .
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。