可视化讲解:什么是八皇后问题?

前言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

概念介绍

1. 八皇后问题起源

  • 八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
  • 问题描述:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。
  • 请问一共有多少种摆法?

原理讲解

  • 由于篇幅限制,我们将八皇后问题简化为4皇后问题来讲解其原理(八皇后问题和4皇后问题的原理是一致的)
  1. 第一步,我们从第一行开始,遍历第一行中所有的列,找到第一个适合放置皇后的位置。皇后位置用黑色背景表示。此时效果如下图所示
    在这里插入图片描述
  2. 由于任意两个皇后不得处在同一行、同一列或者同一对角斜线上。所以第1个皇后所在的行、列和对角线上的位置都是危险位置,不能再放置第2个皇后。危险位置我们用红色背景表示,安全位置我们用绿色背景表示。此时效果如下图所示
    在这里插入图片描述
  3. 第二步,我们从第二行开始,遍历第二行中所有的列,在安全位置范围内找到第一个适合放置皇后的位置。皇后位置用黑色背景表示。此时效果如下图所示
    在这里插入图片描述
  4. 由于任意两个皇后不得处在同一行、同一列或者同一对角斜线上。所以第2个皇后所在的行、列和对角线上的位置都是危险位置,不能再放置第3个皇后。危险位置我们用红色背景表示,安全位置我们用绿色背景表示。此时效果如下图所示
    在这里插入图片描述
  5. 第三步,我们从第三行开始,遍历第三行中所有的列,在安全位置范围内找到第一个适合放置皇后的位置。由于在第三行找不到放置皇后的位置,所以我们进行回退,重新放置第2个皇后的位置。此时效果如下图所示
    在这里插入图片描述
  6. 由于任意两个皇后不得处在同一行、同一列或者同一对角斜线上。所以第2个皇后所在的行、列和对角线上的位置都是危险位置,不能再放置第3个皇后。危险位置我们用红色背景表示,安全位置我们用绿色背景表示。此时效果如下图所示
    在这里插入图片描述
  7. 第四步,我们从第三行开始,遍历第三行中所有的列,在安全位置范围内找到第一个适合放置皇后的位置。皇后位置用黑色背景表示。此时效果如下图所示
    在这里插入图片描述
  8. 由于任意两个皇后不得处在同一行、同一列或者同一对角斜线上。所以第3个皇后所在的行、列和对角线上的位置都是危险位置,不能再放置第4个皇后。危险位置我们用红色背景表示,安全位置我们用绿色背景表示。此时效果如下图所示
    在这里插入图片描述
  9. 第五步,我们从第四行开始,遍历第四行中所有的列,在安全位置范围内找到第一个适合放置皇后的位置。由于在第四行找不到放置皇后的位置,所以我们进行回退。由于第2个,第3个皇后已经没有可选的位置,所以我们重新放置第1个皇后的位置。此时效果如下图所示
    在这里插入图片描述
  10. 由于任意两个皇后不得处在同一行、同一列或者同一对角斜线上。所以第1个皇后所在的行、列和对角线上的位置都是危险位置,不能再放置第2个皇后。危险位置我们用红色背景表示,安全位置我们用绿色背景表示。此时效果如下图所示
    在这里插入图片描述
  11. 第六步,我们从第二行开始,遍历第二行中所有的列,在安全位置范围内找到第一个适合放置皇后的位置。皇后位置用黑色背景表示。此时效果如下图所示
    在这里插入图片描述
  12. 由于任意两个皇后不得处在同一行、同一列或者同一对角斜线上。所以第2个皇后所在的行、列和对角线上的位置都是危险位置,不能再放置第3个皇后。危险位置我们用红色背景表示,安全位置我们用绿色背景表示。此时效果如下图所示
    在这里插入图片描述
  13. 第七步,我们从第三行开始,遍历第三行中所有的列,在安全位置范围内找到第一个适合放置皇后的位置。皇后位置用黑色背景表示。此时效果如下图所示
    在这里插入图片描述
  14. 由于任意两个皇后不得处在同一行、同一列或者同一对角斜线上。所以第3个皇后所在的行、列和对角线上的位置都是危险位置,不能再放置第4个皇后。危险位置我们用红色背景表示,安全位置我们用绿色背景表示。此时效果如下图所示
    在这里插入图片描述
  15. 第八步,我们从第四行开始,遍历第四行中所有的列,在安全位置范围内找到第一个适合放置皇后的位置。皇后位置用黑色背景表示。此时效果如下图所示
    在这里插入图片描述
  16. 至此,我们已经成功的在4×4的象棋上摆放四个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。当然这只是其中一种解法,还有另一种解法。留着读者自行研究。

效果展示

在这里插入图片描述

更多算法学习请关注我的公众号

在这里插入图片描述

说明

  • 在公众号中回复“算法源码”即可获取十大经典算法源码
  • 在公众号中回复“算法书籍”即可获取经典入门算法书籍
  • 在公众号中回复“数据结构”即可获取数据结构相关源码
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
八皇后问题是一个经典的回溯算法问题,目标是在8x8的棋盘上放置8个皇后,使得每个皇后都不会互相攻击(即在同一行、同一列或同一对角线上)。这是一个NP完全问题,因此没有一种有效的算法可以解决所有情况,但可以使用回溯算法来解决某些情况。 回溯算法的基本思想是尝试所有可能的解决方案,并在不满足条件的情况下回溯(撤销之前的决策),直到找到一个满足条件的解决方案或尝试了所有可能的方案。 在八皇后问题中,我们可以使用一个数组来表示每个皇后的位置,然后通过递归函数来尝试所有可能的解决方案。在每一步中,我们尝试在当前行中放置一个皇后,然后检查是否满足条件(即是否与之前的皇后处于同一列或同一对角线),如果满足条件,则递归到下一行,否则回溯并尝试下一个位置。 以下是使用Python实现的八皇后问题的代码示例: ```python def is_valid(board, row, col): # 检查该位置是否与之前的皇后冲突 for i in range(row): if board[i] == col or abs(board[i] - col) == row - i: return False return True def solve(board, row): # 找到一个解决方案 if row == len(board): return True for col in range(len(board)): if is_valid(board, row, col): board[row] = col if solve(board, row + 1): return True board[row] = -1 return False # 初始化棋盘 board = [-1] * 8 # 解决问题并输出结果 if solve(board, 0): for row in range(8): line = "" for col in range(8): if board[row] == col: line += "Q " else: line += ". " print(line) else: print("No solution found.") ``` 该代码将输出八皇后问题的一个解决方案,其中“Q”表示皇后的位置,而“.”表示空格。如果没有找到解决方案,则输出“No solution found.”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值