搜索算法练习——八皇后问题

34 篇文章 0 订阅
31 篇文章 0 订阅

八皇后问题是一个经典的回溯算法问题,其目标是在8×8的棋盘上放置八个皇后,使得它们彼此之间不会相互攻击,即任意两个皇后都不在同一行、同一列或同一斜线上。

我们可以使用回溯算法来解决这个问题,其中深度优先搜索(DFS)用于尝试每个可能的放置位置。

def is_safe(board, row, col):
    """
    检查在棋盘上的指定位置是否安全,即是否可以放置皇后。
    
    Parameters:
        board (list): 当前棋盘的状态,表示为一个二维列表。
        row (int): 要检查的行。
        col (int): 要检查的列。
    
    Returns:
        bool: 如果在该位置放置皇后是安全的,则返回True,否则返回False。
    """
    # 检查同一列上是否已经存在皇后
    for i in range(row):
        if board[i][col] == 1:
            return False
    
    # 检查左上方斜线上是否已经存在皇后
    for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):
        if board[i][j] == 1:
            return False
    
    # 检查右上方斜线上是否已经存在皇后
    for i, j in zip(range(row-1, -1, -1), range(col+1, len(board))):
        if board[i][j] == 1:
            return False
    
    return True

def solve_queens(board, row):
    """
    使用回溯算法解决八皇后问题。
    
    Parameters:
        board (list): 当前棋盘的状态,表示为一个二维列表。
        row (int): 当前行号。
    
    Returns:
        bool: 如果找到了解决方案,则返回True,否则返回False。
    """
    if row >= len(board):
        return True
    
    for col in range(len(board)):
        if is_safe(board, row, col):
            board[row][col] = 1
            if solve_queens(board, row + 1):
                return True
            board[row][col] = 0
    
    return False

def print_board(board):
    """
    打印棋盘。
    
    Parameters:
        board (list): 当前棋盘的状态,表示为一个二维列表。
    """
    for row in board:
        print(" ".join(map(str, row)))
    print()

# 初始化一个空棋盘
board = [[0] * 8 for _ in range(8)]

# 解决八皇后问题
if solve_queens(board, 0):
    print("八皇后问题的解决方案:")
    print_board(board)
else:
    print("未找到解决方案。")

在上述代码中,我们首先定义了两个辅助函数:

  1. is_safe(board, row, col):用于检查在棋盘上的指定位置是否安全,即是否可以放置皇后。
  2. solve_queens(board, row):使用回溯算法解决八皇后问题。在每一行中,我们尝试将皇后放置在所有可能的位置,并使用深度优先搜索(DFS)来递归地探索每个可能性。

然后,我们初始化一个空棋盘,并调用 solve_queens 函数来解决八皇后问题。如果找到解决方案,则打印棋盘状态;否则,打印未找到解决方案的消息。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmiledrinkCat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值