八皇后-韩顺平java
八皇后-韩顺平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 行都不冲突。
- 在同一列时:
arr[index] == arr[i] - 在同一条斜线时:
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相关推荐
- 韩顺平 java坦克大战_坦克大战完整版(韩顺平java)
[实例简介] 坦克大战完整源代码(韩顺平java视频配套) [实例截图] [核心代码] 5i86q5 └── 源码 └── Class14 ├── 111.wav ├── bin │ ├── bo ...
- Java笔记(韩顺平Java基础12-14章)
Java学习笔记(第12章 P444-P459)(第13章P460-P498)(第14章P499-P553) 第12章 异常-Exception 异常介绍 编译异常 异常处理 try-catch异常处 ...
- 八皇后java_经典八皇后问题:Java语言
问题描述:将八个皇后放在棋盘上,任何两个皇后都不能互相攻击(即没有任何两个皇后在同一行.同一列或者同一对角线上)如图所示,题目来自于<java语言程序设计:基础篇>练习题6.20和6.22 ...
- 八皇后问题的Java递归算法
1. 八皇后问题 在8*8的棋盘上,放置8个皇后,使各个皇后之间不处于同一行.同一列.同一斜线上,如下图红线部分是和中间红色圆圈冲突位置. 2. 八皇后的递归分析 1. 使用递归分析,首先,第一个皇后 ...
- 韩顺平Java自学笔记 反射
一.反射入门案例 目录 一.反射入门案例 二.反射的机制 1.反射的原理 2.反射相关的类 3.反射的优点和缺点 三.Class类详解 1.Class类的特征 2.Class的常用方法 3.获取Cla ...
- 韩顺平Java学习 泛型
目录 一.泛型的语法 1.传统的方法遍历集合存在的问题 2.使用泛型来解决传统集合添加元素带来的问题 3.泛型使用介绍 4.泛型的使用细节 5.泛型课堂练习 二.自定义泛型 1.自定义泛型类的规范 ...
- B站韩顺平java学习笔记(六)--面向对象编程章节
目录 一.类和对象 1.定义及区别 2.对象内存布局 3.属性/成员变量 (1)基本介绍 (2)注意事项和细节说明 (3)访问属性 4.对象 (1)创建对象 (2)对象分配机制 (3)Java创建对 ...
- 韩顺平java基础——坦克大战(含有线程、I\O流的讲解)
写在最前边: 研究生一枚,为后端实习和未来工作打基础.无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了. 韩顺平老师课程地址:https://ww ...
- 回溯算法解决八皇后问题(JAVA实现)
送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...
- 遗传算法解决八皇后问题(java源码)
本文源码下载链接:https://download.csdn.net/download/goulvjiang3176/11221063 另有贪心算法解决八皇后问题的源码下载链接:https://dow ...
最新文章
- linux环境下快速配置hadoop集群免密登录
- CentOS7(64位)安装NVIDIA显卡驱动和CUDA8.0
- 基于python物流管理系统毕业设计-Python程序设计实验报告一 :熟悉IDLE和在线编程平台...
- Linux之Nginx
- Tensorflow中placeholder传入值与feed_dict喂食器的联系与用法
- 从真实项目中抠出来的设计模式——第二篇:过滤器模式
- java默认代码地址_Java 8默认方法可能会破坏您的(用户)代码
- linux cpu不足处理运维,Linux运维知识之Linux服务器CPU占用率较高问题排查思路
- 学车是学手动档好,还是学自动档好呢?另外建议自驾游选哪个档比较好呢?
- 非常经典的java编程题全集-共50题(11-30)
- AI换脸,流行一阵儿了;其中原理你一定也明白!
- SV绿皮书笔记(八)
- 显卡优化以提高计算机性能,《绝地求生》完美显卡优化教程:低配电脑也能吃鸡无压力!...
- [转]如何进行人脉管理
- MongoDB启动shutting down with code:100处理
- laravel-pay支付接入流程
- 蜂云软件开发微信crm系统的功能点
- Allegro通孔焊盘制作
- 陀螺仪程序---可直接用
- Qt与设计模式(全)
热门文章
- 最新STM32G0系列选型表1
- shiro会话监听_shiro session 监听
- vue引入字体文件踩坑
- Logisim元件用法详解二:Gates 门
- 在android中如何显示维语
- Mac好用的图片压缩软件——JPG Compress 2 for Mac
- opencv android 车牌,OpenCV + Android +车牌号识别
- python遗传算法解简单整数规划与原理探究
- 计算机组成原理(唐朔飞)--第一篇 概论
- 高校科研管理系统源代码_教育领域各大高校如何建设智慧校园?你的学校够数字化吗?...