八皇后问题是一个经典的回溯算法问题,目标是在一个8x8的棋盘上放置八个皇后,使得它们互相之间不能相互攻击(即不能在同一行、同一列或同一对角线上)。
下面是一种替代解法,使用递归和回溯来解决八皇后问题。
def solve_n_queens(n):
def is_valid(board, row, col):
# 检查同一列是否已经有皇后
for i in range(row):
if board[i][col] == 'Q':
return False
# 检查左上方是否有皇后
i = row - 1
j = col - 1
while i >= 0 and j >= 0:
if board[i][j] == 'Q':
return False
i -= 1
j -= 1
# 检查右上方是否有皇后
i = row - 1
j = col + 1
while i >= 0 and j < n:
if board[i][j] == 'Q':
return False
i -= 1
j += 1
return True
def backtrack(board, row):
if row == n:
# 找到一组解,将其加入结果集
result.append(list(board))
return
for col in range(n):
if is_valid(board, row, col):
# 放置皇后
board[row][col] = 'Q'
# 继续递归下一行
backtrack(board, row + 1)
# 回溯,撤销皇后
board[row][col] = '.'
result = []
# 初始化棋盘
board = [['.' for _ in range(n)] for _ in range(n)]
backtrack(board, 0)
return result
# 测试
solutions = solve_n_queens(8)
for solution in solutions:
for row in solution:
print(' '.join(row))
print()
这段代码会输出所有八皇后问题的解,每个解都是一个8x8的棋盘,其中皇后位置用"Q"表示,空白位置用"."表示。