一、八皇后问题介绍

(本次使用回溯算法解决,之后会用贪心算法优化)

在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、 同一列或同一斜线上,问有多少种摆法(92)。

二、八皇后问题算法思路分析

  1. 第一个皇后先放第一行第一列

  2. 第二个皇后放在第二行第一列、然后判断是否 和前面已经放置好的皇后冲突, 如果冲突,继续放在第二列、第三列、依次把所有列都 放完,找到一个合适

  3. 继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,算是找到了一个正确 解

  4. 当得到一个正确解时,在栈回退到上一个栈时(倒数第二行),就会开始回溯,即将第一个皇后,放到第一列的所有正确解, 全部得到.

  5. 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4 的步骤

三、关于算法的一点说明

理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题. arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3} //对应 arr 下标 表示第几行,即第几个皇后,arr[i] = val , val 表示第 i+1 个皇后,放在第 i+1 行的第 val+1 列

四、代码实现


```java
package cn.zzw.algorithm.recursion;public class Queen {//定义一个max表示有多少个皇后int max=8;//定义一个数组,保存皇后放置成功时的摆放位置int array[] = new int[max];//定义count,用来记录总共有多少种成功的摆法static int count = 0;//定义judgeCount,用来记录递归回溯了多少次static int judgeCount = 0;public static void main(String[] args) {Queen queen = new Queen();queen.check(0);System.out.printf("一共有%d种解法",count);System.out.println();System.out.printf("一共判断冲突的次数是%d",judgeCount);}//编写一个放置皇后的方法private void check(int n){if(n==max){//n=8,表示前8个皇后已经摆放好print();return;}//依次放入各个皇后,并判断是否冲突for(int i=0;i<max;i++){array[n]=i;if (judge(n)){//如果不冲突check(n+1);}//如果冲突,就继续执行array[n]=i;即将第n个皇后放置在后一列的位置上,继续判断}}//定义一个judge,判断当前摆放的皇后和前面已经摆放好的皇后冲突//n表示低几个皇后private boolean judge(int n){judgeCount++;for(int i=0;i<n;i++){//1.array[i]==array[n]判断第n个皇后是否与前面n-1个皇后在同一列//2.Math.abs(n-i) == Math.abs(array[n] - array[i]) 表示判断第 n 个皇后是否和第 i 皇后是否在同一斜 线//3.无需判断是否在同一行,因为放在一维数组中,一维数组的下标在增加,所以相当于n就在增加,所以不可能在同一行if(array[i]==array[n] || Math.abs(n-i)==Math.abs(array[n]-array[i])){return false;}}return true;}//定一个一个print方法,用来打印皇后成功的摆法private void print(){count++;for (int i = 0; i < array.length; i++){System.out.print(array[i]+" ");}System.out.println();}
}
**测试结果**:```java
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=25579:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.recursion.Queen
0 4 7 5 2 6 1 3
0 5 7 2 6 3 1 4
0 6 3 5 7 1 4 2
0 6 4 7 1 3 5 2
1 3 5 7 2 0 6 4
1 4 6 0 2 7 5 3
1 4 6 3 0 7 5 2
1 5 0 6 3 7 2 4
1 5 7 2 0 3 6 4
1 6 2 5 7 4 0 3
1 6 4 7 0 3 5 2
1 7 5 0 2 4 6 3
2 0 6 4 7 1 3 5
2 4 1 7 0 6 3 5
2 4 1 7 5 3 6 0
2 4 6 0 3 1 7 5
2 4 7 3 0 6 1 5
2 5 1 4 7 0 6 3
2 5 1 6 0 3 7 4
2 5 1 6 4 0 7 3
2 5 3 0 7 4 6 1
2 5 3 1 7 4 6 0
2 5 7 0 3 6 4 1
2 5 7 0 4 6 1 3
2 5 7 1 3 0 6 4
2 6 1 7 4 0 3 5
2 6 1 7 5 3 0 4
2 7 3 6 0 5 1 4
3 0 4 7 1 6 2 5
3 0 4 7 5 2 6 1
3 1 4 7 5 0 2 6
3 1 6 2 5 7 0 4
3 1 6 2 5 7 4 0
3 1 6 4 0 7 5 2
3 1 7 4 6 0 2 5
3 1 7 5 0 2 4 6
3 5 0 4 1 7 2 6
3 5 7 1 6 0 2 4
3 5 7 2 0 6 4 1
3 6 0 7 4 1 5 2
3 6 2 7 1 4 0 5
3 6 4 1 5 0 2 7
3 6 4 2 0 5 7 1
3 7 0 2 5 1 6 4
3 7 0 4 6 1 5 2
3 7 4 2 0 6 1 5
4 0 3 5 7 1 6 2
4 0 7 3 1 6 2 5
4 0 7 5 2 6 1 3
4 1 3 5 7 2 0 6
4 1 3 6 2 7 5 0
4 1 5 0 6 3 7 2
4 1 7 0 3 6 2 5
4 2 0 5 7 1 3 6
4 2 0 6 1 7 5 3
4 2 7 3 6 0 5 1
4 6 0 2 7 5 3 1
4 6 0 3 1 7 5 2
4 6 1 3 7 0 2 5
4 6 1 5 2 0 3 7
4 6 1 5 2 0 7 3
4 6 3 0 2 7 5 1
4 7 3 0 2 5 1 6
4 7 3 0 6 1 5 2
5 0 4 1 7 2 6 3
5 1 6 0 2 4 7 3
5 1 6 0 3 7 4 2
5 2 0 6 4 7 1 3
5 2 0 7 3 1 6 4
5 2 0 7 4 1 3 6
5 2 4 6 0 3 1 7
5 2 4 7 0 3 1 6
5 2 6 1 3 7 0 4
5 2 6 1 7 4 0 3
5 2 6 3 0 7 1 4
5 3 0 4 7 1 6 2
5 3 1 7 4 6 0 2
5 3 6 0 2 4 1 7
5 3 6 0 7 1 4 2
5 7 1 3 0 6 4 2
6 0 2 7 5 3 1 4
6 1 3 0 7 4 2 5
6 1 5 2 0 3 7 4
6 2 0 5 7 4 1 3
6 2 7 1 4 0 5 3
6 3 1 4 7 0 2 5
6 3 1 7 5 0 2 4
6 4 2 0 5 7 1 3
7 1 3 0 6 4 2 5
7 1 4 2 0 6 3 5
7 2 0 5 1 4 6 3
7 3 0 2 5 1 6 4
一共有92种解法一共判断冲突的次数是15720
Process finished with exit code 0

十二、八皇后问题(递归回溯)相关推荐

  1. 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai,关注更多干货和学习资源 记得点赞.在看 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里 ...

  2. 八皇后问题(回溯法amp;枚举法)

    作者 : 卿笃军 本文讨论了八皇后问题的三种解决方案: 一.枚举法 二.回溯法(递归版) 三.回溯法(非递归版) 本来这些代码是以前编写好的,没有发表,由于最近又学习到了八皇后问题,自己整理了一下发表 ...

  3. 8皇后问题-递归-回溯(Java)

    目录 5.6 递归-八皇后问题(回溯算法) 5.6.1 解题思路 5.6.2 代码实现 第一遍的是跟着老师做的,所以添加了我自己大量的注解. 本次n皇后问题出自韩顺平的数据结构和算法 5.6 递归-八 ...

  4. 算法:递归-八皇后问题(回溯算法)

    1.问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯・贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不 ...

  5. 递归-八皇后问题(回溯算法)

    一:八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个 ...

  6. 八皇后的一个回溯递归解法

    解法来自严蔚敏的数据结构与算法. 代码如下: #include <iostream> using namespace std; const int N = 8;//皇后数 int coun ...

  7. 算法分析与设计-八皇后问题(回溯法)

    回溯法: 回溯的意义是在递归直到可解的最小问题后,逐步返回原问题的过程,而这里所说的回溯算法实际上是一个类似枚举的搜索尝试方法,它的主题思想是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 ...

  8. 从八皇后问题思考回溯法

    一.八皇后问题 八皇后是经典的回溯法问题,题目是说将八个皇后,放到8×8的国际象棋棋盘中中,使得任意两个皇后都不能在同一行.同一列以及同一条对角线上.下图是一个四皇后的搜索示意图. 八皇后问题可以通过 ...

  9. 八皇后解法(回溯法)

    package com.company; /** * Created by Administrator on 2016/9/15. */public class EigthQueue { privat ...

  10. [LeetCode ] 八皇后问题以及回溯法

    对于回溯法,写 backtrack 函数时,需要维护走过的「路径」和当前可以做的「选择列表」,当触发「结束条件」时,将「路径」记入结果集: result=[] def backtrack(路径,选择列 ...

最新文章

  1. Tomcat 服务器的端口号的修改
  2. Python拟合数据样本的分布
  3. 【研发管理】聊一聊DevOps
  4. 2017年度最值得读的AI论文评选 | 大张旗鼓送福利
  5. 696. Count Binary Substrings 计数二进制子串
  6. 计算机操作系统思维导图_我在b站学计算机
  7. inittab脚本启动解析 (zz)
  8. 力扣删除排序数组中的重复项
  9. [BZOJ3781]小B的询问
  10. centos7 mysql
  11. 国内外独立IP行情及网站用独立IP优势面面观
  12. 《相关性准则——大数据时代的高效能之道》一一2.2 意识与大脑处理信息的能力...
  13. EditPlus 使用技巧集萃(转)
  14. 揭秘 Python 火爆背后的真实现状,2020 Python 开发者调查
  15. Scala学习之Option类
  16. 数据挖掘知识图谱(大数据分析师)
  17. cedit多行文本设置透明背景会重叠_python:电商用户评价文本分析(wordcloud+jieba)...
  18. LINUX安装cuDNN
  19. 20200627每日一句
  20. Betwin实现电脑一分为二

热门文章

  1. go kegg_零基础 GO 与 KEGG 分析,手把手教你用多种途径实现!
  2. 回顾Java课本容易遗忘的知识(一)
  3. Machine Learning | (4) Scikit-learn的分类器算法-逻辑回归
  4. 脚本控制向Android模拟拨打电话,发送短信,定位设置功能
  5. c语言判断s1是否大于s2,C语言程序设计_复习资料一.doc
  6. java中包的_Java中的包
  7. python修改nginx配置文件_zookeeper 动态管理nginx配置
  8. 方法革新:8个宏基因组分析新工具 | 热心肠日报
  9. JoVE微生物组专刊征稿,写方法拍视频教程发SCI(宏基因组公众号专属福利)
  10. R语言ggplot2包和ggtext包在可视化图像中的指定位置添加文本框(横向文本框、竖向文本框)