八皇后-韩顺平java

  • 韩顺平java P227
    • 问题描述
    • 老韩思路
    • 思路解读
    • 如何用arr[8]表示一种摆法
    • 如何使用递归解决八皇后问题
      • 1. 找到递归终止条件
      • 2. 如何判断每一行是否放置成功
    • 完整代码

韩顺平java P227

最近跟着老韩学java,学到P227集的时候老韩留了个八皇后问题,视频最后说以后会讲解这个问题,然后我找了一遍都没找到。这里给小伙伴分享一下我学习后的八皇后问题解法。

问题描述

老韩思路

思路解读

棋盘为八行八列,要放置八个皇后,且任意两个皇后都不能处于同一行、同一列或同一斜线。那就意味着每一行都要放置一个皇后。我们先在第一行放置皇后,再在第二行放置皇后,并且要检查与第一行的皇后是否冲突。如果不冲突,继续在第三行放置皇后,并且要分别检查是否与第一行和第二行的皇后冲突… …,直到在第八行放置皇后,并且要检查是否与前1-7行的皇后冲突。如果不冲突,则得到一种答案。

如何用arr[8]表示一种摆法

一维数组arr[8]共有8个元素,下标索引0、1、2、…、7分别表示棋盘的第1、2、3、…、8行。该索引对应的值表示棋盘对应的列。例如arr[0] = 0,表示第 1 个皇后放在棋盘的第 1 行的第 1 列;arr[1] = 4 表示第 2 个皇后放在棋盘的第 2 行的第列 5 列。所以图中的 arr[8] = {0, 4, 7, 5, 2, 6, 1, 3} 能表示一种摆法。

如何使用递归解决八皇后问题

使用递归解决该问题的关键:

1. 找到递归终止条件

我们从第 1 行开始放置皇后,每一行放置成功后,才能进行下一行的放置,如果我们成功的放置完八个皇后,我们就终止一次递归。
继续递归的条件:上一行放置成功。如代码段中的 judge 函数,上一行放置成功,judge返回true,继续迭代。

else中的for循环表示:index初始值为0,即第 1 行,遍历1 ~ 8列。如果放置成功,进入下一行(index+1),再次遍历1 ~ 8列。直至遍历完所有可能的结果。

if(index == 8) { // 退出条件:index能增加到8// 可输出数组看看for(int i = 0; i < 8; i++) {System.out.print(arr[i] + " ");}System.out.println();count++;} else {  // 递归for(int i = 0; i < 8; i++) {  // 8 列arr[index] = i;  // index行,i列if(judge(index)) {  // 如果该行皇后放置成功,则可以递归进入下一行进行放置,直至到达退出条件check(index + 1);}}
}

2. 如何判断每一行是否放置成功

我们每行放置一个皇后,就已经避免了任意两个皇后在同一行,只需要用代码实现判断是否在同一列或同一条斜线。传入的参数 index 为当前正在放置的行,必须与前面的0 ~ index-1 行都不冲突。

  1. 在同一列时:
    arr[index] == arr[i]
  2. 在同一条斜线时:
    Math.abs(index - i) == Math.abs(arr[index] - arr[i])
    (相当于斜率为 1 或 -1)

代码如下:

// 判断该皇后是否与之前的皇后冲突
public boolean judge(int index) {for(int i = 0; i < index; i++) {if(arr[index] == arr[i] || Math.abs(index - i) == Math.abs(arr[index] - arr[i])) {return false;} }return true;
}

完整代码

由于老韩是在 方法的递归调用 中将的这个问题,所以我的代码承袭了老韩当时的风格,建了一个名为 T 的类。(手动狗头)

public class EightQueen {public static void main(String[] args) {int count = 0;T t = new T();count = t.check(0);System.out.println("八皇后解法有:" + count + " 种");}
}class T {int[] arr = new int[8];int count = 0;public int check(int index) {  // 从0行开始if(index == 8) { // 退出条件:index能增加到8// 可输出数组看看for(int i = 0; i < 8; i++) {System.out.print(arr[i] + " ");}System.out.println();count++;} else {  // 递归for(int i = 0; i < 8; i++) {  // 8 列arr[index] = i;  // index行,i列if(judge(index)) {  // 如果该行皇后放置成功,则可以递归进入下一行进行放置,直至到达退出条件check(index + 1);}}}return count;}// 判断该皇后是否与之前的皇后冲突public boolean judge(int index) {for(int i = 0; i < index; i++) {if(arr[index] == arr[i] || Math.abs(index - i) == Math.abs(arr[index] - arr[i])) {return false;} }return true;}
}public boolean judge(int index) {for(int i = 0; i < index; i++) {if(arr[index] == arr[i] || Math.abs(index - i) == Math.abs(arr[index] - arr[i])) {return false;} }return true;
}

有疑问欢迎评论区留言!

如果觉得我讲的不清楚,可参考以下链接:
https://www.bilibili.com/video/BV1Yf4y1Q7kJ

八皇后-韩顺平java相关推荐

  1. 韩顺平 java坦克大战_坦克大战完整版(韩顺平java)

    [实例简介] 坦克大战完整源代码(韩顺平java视频配套) [实例截图] [核心代码] 5i86q5 └── 源码 └── Class14 ├── 111.wav ├── bin │   ├── bo ...

  2. Java笔记(韩顺平Java基础12-14章)

    Java学习笔记(第12章 P444-P459)(第13章P460-P498)(第14章P499-P553) 第12章 异常-Exception 异常介绍 编译异常 异常处理 try-catch异常处 ...

  3. 八皇后java_经典八皇后问题:Java语言

    问题描述:将八个皇后放在棋盘上,任何两个皇后都不能互相攻击(即没有任何两个皇后在同一行.同一列或者同一对角线上)如图所示,题目来自于<java语言程序设计:基础篇>练习题6.20和6.22 ...

  4. 八皇后问题的Java递归算法

    1. 八皇后问题 在8*8的棋盘上,放置8个皇后,使各个皇后之间不处于同一行.同一列.同一斜线上,如下图红线部分是和中间红色圆圈冲突位置. 2. 八皇后的递归分析 1. 使用递归分析,首先,第一个皇后 ...

  5. 韩顺平Java自学笔记 反射

    一.反射入门案例 目录 一.反射入门案例 二.反射的机制 1.反射的原理 2.反射相关的类 3.反射的优点和缺点 三.Class类详解 1.Class类的特征 2.Class的常用方法 3.获取Cla ...

  6. 韩顺平Java学习 泛型

    目录 一.泛型的语法 1.传统的方法遍历集合存在的问题 2.使用泛型来解决传统集合添加元素带来的问题 3.泛型使用介绍 4.泛型的使用细节 5.泛型课堂练习 二.自定义泛型 1.自定义泛型类的规范 ​ ...

  7. B站韩顺平java学习笔记(六)--面向对象编程章节

    目录 一.类和对象 1.定义及区别 2.对象内存布局 3.属性/成员变量 (1)基本介绍 (2)注意事项和细节说明 (3)访问属性 4.对象 (1)创建对象 (2)对象分配机制 ​(3)Java创建对 ...

  8. 韩顺平java基础——坦克大战(含有线程、I\O流的讲解)

    写在最前边: 研究生一枚,为后端实习和未来工作打基础.无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了. 韩顺平老师课程地址:https://ww ...

  9. 回溯算法解决八皇后问题(JAVA实现)

    送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...

  10. 遗传算法解决八皇后问题(java源码)

    本文源码下载链接:https://download.csdn.net/download/goulvjiang3176/11221063 另有贪心算法解决八皇后问题的源码下载链接:https://dow ...

最新文章

  1. linux环境下快速配置hadoop集群免密登录
  2. CentOS7(64位)安装NVIDIA显卡驱动和CUDA8.0
  3. 基于python物流管理系统毕业设计-Python程序设计实验报告一 :熟悉IDLE和在线编程平台...
  4. Linux之Nginx
  5. Tensorflow中placeholder传入值与feed_dict喂食器的联系与用法
  6. 从真实项目中抠出来的设计模式——第二篇:过滤器模式
  7. java默认代码地址_Java 8默认方法可能会破坏您的(用户)代码
  8. linux cpu不足处理运维,Linux运维知识之Linux服务器CPU占用率较高问题排查思路
  9. 学车是学手动档好,还是学自动档好呢?另外建议自驾游选哪个档比较好呢?
  10. 非常经典的java编程题全集-共50题(11-30)
  11. AI换脸,流行一阵儿了;其中原理你一定也明白!
  12. SV绿皮书笔记(八)
  13. 显卡优化以提高计算机性能,《绝地求生》完美显卡优化教程:低配电脑也能吃鸡无压力!...
  14. [转]如何进行人脉管理
  15. MongoDB启动shutting down with code:100处理
  16. laravel-pay支付接入流程
  17. 蜂云软件开发微信crm系统的功能点
  18. Allegro通孔焊盘制作
  19. 陀螺仪程序---可直接用
  20. Qt与设计模式(全)

热门文章

  1. 最新STM32G0系列选型表1
  2. shiro会话监听_shiro session 监听
  3. vue引入字体文件踩坑
  4. Logisim元件用法详解二:Gates 门
  5. 在android中如何显示维语
  6. Mac好用的图片压缩软件——JPG Compress 2 for Mac
  7. opencv android 车牌,OpenCV + Android +车牌号识别
  8. python遗传算法解简单整数规划与原理探究
  9. 计算机组成原理(唐朔飞)--第一篇 概论
  10. 高校科研管理系统源代码_教育领域各大高校如何建设智慧校园?你的学校够数字化吗?...