目录

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

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

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际象棋棋手马克斯贝瑟斯于1848年提出:在88格的国际象棋上摆放八个皇后,使其不能处于同一行、同一列或同一斜线,问有多少种摆法

5.6.1 解题思路

1)第一个皇后放在第一行、第一列
2)第二个皇后放在第二行第一列,然后判断是否可以这样摆放,如果不可以,就继续放在第二行第二列、第三列、依次把所有的列放完,找到一个合适的
3)继续放第三个皇后,还是第一列、第二列。。。。直到第8个皇后也放
在一个不冲突的位置,这时,视为找到一个正确解
4)当得到一个正确解时,在栈回退到上一个栈,就会开始回溯,即将第一个皇后,放在第一列的所有正确解全部得到。
5)然后回头继续放第一个皇后放在第二列,后面继续循环执行1、2、3、4的步骤

5.6.2 代码实现

package com.ldm.recursion;/*** @author 梁东明* 2022/8/25* 86139* 8皇后递归* 人生小建议,看不懂的方法或者类记得CTRL + 点击 看看注解*/
public class Queue8 {//定义一个max表示有多少个皇后int max = 8;//定义数组array,保存皇后放置位置的结果,比如 arr = { 0 , 4, 7, 5, 2, 6, 1, 3}int[] arr = new int[max];static int count = 0;//这个变量是统计有多少种解法static int judgeCount; //这个变量是统计回溯了多少次的public static void main(String[] args) {//测试代码Queue8 queue8 = new Queue8();//这里的0,是从第一个皇后放起,不影响你有多少个皇后,因为一开始就定义了max = 8;queue8.check(0);System.out.println("一共有 = " + count+"解法");System.out.println("一共有判断冲突的 = " + judgeCount+" 次回溯次数");}/*** 编写一个方法,放置第n个皇后* 特别注意:check 是每一次递归时,就会进入check中都有 for(int i = 0; i < max ;i++),因此会有回溯* 回溯就是把上一层没走完的for循环走下去,不是把本次的for循环走完,很重要的知识点!!!!,家人们一定要记住* @param n 表示第几个皇后*/private void check(int n){if (n == max){  //如果n是第八个皇后,说明已经放完全部的皇后print();return;}/*//依次放入皇后,并判断是否冲突//for循环的快捷键就是fori,//可以直接写max.fori就可以迅速打印for循环啦!//无聊的小知识又增加了*/for (int i = 0; i < max; i++) {//先把当前的皇后n,放到该行的第一列arr[n] = i;//判断当放置第n个皇后到i列时,是否冲突if (judge(n)){ //不冲突//接着放置n+1个皇后,即开始递归 很重要!!!!!!一定要看懂这行代码check(n+1);}//如果冲突,就继续执行arr[n] = i;但是i在循环中,下一次循环i=i+1;即 将第n个皇后,放置在本行的后移一个位置}}/***  查看当我们放置第n个皇后,就去检测该皇后是否和前面已经摆放的皇后冲突* @param n 表示第n个皇后* @return*/private boolean judge(int n){judgeCount++;for (int i = 0; i < n; i++) {if (arr[i] ==arr[n] || Math.abs(n-i) == Math.abs(arr[n]-arr[i])){/*//如果两个皇后在同一列会相互攻击,同一斜线也会相互攻击,同一行也会相互攻击,所以要排除///Math.abs ctrl+点击进去看源码可以知道这是用来求绝对值的//更详细的说法是: 行数的差值不能等于列数的差值,相等就说明在同一斜线上//数学学过吧? 把y=x在象限画出来就可以很清楚理解了 斜率为1,在同一条斜线上//你可能会说,还有一个是否在同一行没有判断,如果皇后同一行也会相互攻击//但是你有没有想过:n是递增的,它们是不可能在同一行的 ,所以不需要判断在同一行*/return false;}}return true;}/*** 写一个方法,可以将皇后摆放的位置打印出来*/private void print(){count++;for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}
}

第一遍的是跟着老师做的,所以添加了我自己大量的注解。

理解老师的解题思路之后,我觉得有必要花点时间自己重新写一份,锻炼自己写的代码能力和编程思维,惊奇的发现居然只花了三分钟就完整实现了8皇后问题的代码。
所以,我真心建议大家,如果真的看懂了代码,不妨自己找张纸写一下解题思路,再根据思路重新手打一份代码。可能会给你带来一份意想不到的惊喜。
代码量真的很少的,核心代码可能就几十行。如果不迎难而上,很难锻炼到自己的编程能力

package com.ldm.recursion;/*** @author 梁东明* 2022/8/26* 人生建议:看不懂的方法或者类记得CTRL + 点击 看看源码或者注解* 点击setting在Editor 的File and Code Templates 修改*/
public class MyQueen8 {int max1 = 8;int[] array = new int[max1];static int count = 0;static int backCount;public static void main(String[] args) {//测试我自己写的代码是否正确MyQueen8 myQueen8 = new MyQueen8();myQueen8.check1(0);System.out.println("解法 = " + count);System.out.println("回溯次数 = " + backCount);}/*** 插入n皇后*/void check1(int n){if (n == max1){print();return;}for (int i = 0; i < max1; i++) {array[n] = i;if (judge1(n)){check1(n+1);}}}/*** 判断插入的第n个皇后是否冲突*/private boolean judge1(int n){backCount++;for (int i = 0; i < n; i++) {if (array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] -array[i])){return false;}}return true;}/*** 打印一维数组*/private void print(){count++;for (int i : array) {System.out.print(i+" ");}System.out.println();}
}

本次n皇后问题出自韩顺平的数据结构和算法

数据结构和算法教程,哔哩哔哩详细教程
在 47-49p,视频共有三个,不到一个小时。二倍速半小时即可看完。

最后,认识一下,我是小白。努力成为一名合格的程序员。期待与你的下次相遇。

8皇后问题-递归-回溯(Java)相关推荐

  1. 蓝桥杯 2n皇后(java递归回溯)

    一.2n皇后问题 问题描述: 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在 ...

  2. 十二、八皇后问题(递归回溯)

    一.八皇后问题介绍 (本次使用回溯算法解决,之后会用贪心算法优化) 在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行. 同一列或同一斜线上,问有多少种摆法(9 ...

  3. N皇后问题(递归回溯)

    今天讲了N后问题,现在来复习一下. N后问题就是在N*N格的棋盘上面放置彼此不受攻击的n个皇后.这里的皇后指的是国际象棋中的皇后,按照国际象棋的规则,皇后可以攻击当前行和当前列还有同一斜线的棋子.简单 ...

  4. 递归/回溯:八皇后问题N-Queens

    N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...

  5. LeetCode—笔记—51、N皇后——递归回溯,个人思路,简单易懂

    LeetCode-笔记-51.N皇后--递归回溯,个人思路,简单易懂 51. N 皇后 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 ...

  6. 递归回溯解决八皇后问题

    文章目录 前言 八皇后问题 问题解析 代码实现 完整代码 前言 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇 ...

  7. 非递归求解N皇后问题(回溯法)

    一般而言,回溯法可以说是一种穷举法,适合于求解各种深度优先搜索的问题. 回溯法是一种应用广泛的算法.其关键点是解空间树和n元组可行解的定义. 非递归回溯法程序的结构基本上是相同的,该程序的结构可以用求 ...

  8. 递归走迷宫java_在Java中的迷宫递归回溯

    嗨即时通讯新的网站很抱歉,如果这是一个重复的问题,但以前的任何问题似乎都不符合我的 我在迷宫结构中练习搜索算法,而我在递归回溯中的尝试不起作用 基本上,我在一本书Dietel第7卷上做了一个练习来创建 ...

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

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

最新文章

  1. 复合高斯积分(节点数小于等于3的版本Python实现)
  2. Java 设计模式 -- 建造者模式
  3. python返回函数值并退出函数_Python函数的返回值和作用域
  4. ECMAScript——基本数据类型之boolean
  5. 2020 科大讯飞全球开发者大会节目单来了!
  6. Abp vnext Web应用程序开发教程 7 —— 作者:数据库集成
  7. java中outputstream以及其子类 flush有什么作用呢
  8. 陈正康考研英语长难句 51~75
  9. 在线sitemap链接提取工具
  10. check_mysql 脚本_如何使用myisamchk和mysqlcheck工具快速修复损坏的MySQL数据库文件
  11. 基本文件管理,针对Centos7的XFS文件系统备份恢复(需要更改)
  12. 基于万维易源提供的API接口实现快递单号查询物流信息
  13. cofax(网络传真机) v3.1.0.0
  14. 吴军,阅读与写作,11,写景:如何寓情于景?
  15. 任务管理器被管理员禁用如何解决
  16. 分析方法笔记--AARRR模型
  17. 测量频率和占空比的几种方法
  18. 少儿编程Scratch学习教程--Scratch介绍及参赛相关
  19. 文件上传工具类FileUploadUtils
  20. java awt 简单计算器,JAVA Swing 开发简易计算器(上)

热门文章

  1. powerbi判断父级是否有子集_powerbi可以进行判断吗?
  2. 人工智能训练师知多少
  3. 2022宁夏杯B题论文分析+完整代码(大学生就业问题分析)
  4. Realtek HD声卡无法单路调节录音音量
  5. [Emuelec]在gamelist.xml中,为中文游戏名生成拼音字母
  6. LabVIEW开发软件著作权申请1-写在前面(相关问题解答)
  7. 论文解读:多任务学习之PLE算法
  8. 走出腾讯和阿里,那些离开大厂的中年人,过得怎么样?
  9. MySQL 一个字段多个id查询
  10. Linux版 乐影音下载器(视频下载器) 使用方法