递归的第三个实际案例:八皇后

老师给的思路:

//1.第一个皇后先放第一行第一列;
    //2.第二个皇后放在第二行第一列、然后判断是否 OK,
    //如果不 OK,则尝试放在第二列、第三列…,直到找到一个合适的位置;
    //3.继续放置第三个皇后,还是第一列、第二列…,直到找到一个合适的位置;
    //4.依次循环下去,直到第 8 个皇后也能放在一个不冲突的位置,就算是找到了一个正确解;
    //5.当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯。本次回溯之后,
    //会即将第一个皇后放到第一列前提下的所有正确解全部得到;
    //6.然后回头从 1 开始,第一个皇后放到第一行第二列,后面继续循环执行 2、3、4 的步骤,
    //直至第一个皇后将第一行的所有列都放置过。至此,便得到了八皇后问题的所有放置解法。

我自己的理解

//创建一个一维数组,index+1表示第(index + 1)个皇后在第(index + 1)行,
    //arr[index] = 3;表示这个皇后在第4列
    //基本思路:假定arr[0] = 0;即第一个皇后在第一列,第二个皇后在第二行即arr[1]
    //判断标准:如果:arr[0] = arr[1],那么表示两个皇后在同一列,
    //如果|arr[1]-arr[0]| = |1-0|;表示两个皇后在同一斜线上
    //假如arr[0] = 7,arr[1] = 6;判断斜线:|0-1| = |7-6|;这个时候就需要取绝对值,绝对值是非负数

第一步:

编写输出算法,代码:

int arr[] = new int[8];//输出算法public void print(){for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + " ");}System.out.println();}

第二步:

编写判断是否冲突的代码

public boolean judge(int index){for(int i = 0; i < index; i++){//判断和之前的index个皇后是否冲突if(arr[i] == arr[index] || Math.abs(arr[index]-arr[i]) == Math.abs(index -i)){return false;}}return true;//必须放在for循环外部,}

放在for循环外部的原因:假如是第7个皇后,必须判断完前六个皇后都不冲突再返回true

第三步:

放置算法:即调用方法,递归

//放置算法,即在棋盘中放置第几个皇后public void put(int index){//首先判断index是否等于8if(index == 8){//当index等于8的时候,即第9个棋子,已经完成了8个棋子的放置print();//调用输出算法}else{for(int i = 0; i < 8; i++){arr[index] = i;//if(judge(index)){//如果返回true则继续判断put(index + 1);}}}}

完整代码

public class QueenTest{public static void main(String[] args){T t1 = new T();t1.put(0);}
}
class T{int arr[] = new int[8];//输出算法public void print(){for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + " ");}System.out.println();}//判断算法public boolean judge(int index){for(int i = 0; i < index; i++){//判断和之前的index个皇后是否冲突if(arr[i] == arr[index] || Math.abs(arr[index]-arr[i]) == Math.abs(index -i)){return false;}}return true;//必须放在for循环外部,}//放置算法,即在棋盘中放置第几个皇后public void put(int index){//首先判断index是否等于8if(index == 8){//当index等于8的时候,即第9个棋子,已经完成了8个棋子的放置print();//调用输出算法}else{for(int i = 0; i < 8; i++){arr[index] = i;//if(judge(index)){//如果返回true则继续判断put(index + 1);}}}}
}

简单的内存分析图

统计共有多少种解法的代码

public class QueenTimes{public static void main(String[] args){int count = 0;T t1 = new T();count = t1.put(0);System.out.println("八皇后一共有" + count + "种解法");}
}
class T{int arr[] = new int[8];int count = 0;//输出算法public void print(){for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + " ");}System.out.println();count ++;}//判断算法public boolean judge(int index){for(int i = 0; i < index; i++){//判断和之前的index个皇后是否冲突if(arr[i] == arr[index] || Math.abs(arr[index]-arr[i]) == Math.abs(index -i)){return false;}}return true;//必须放在for循环外部,}//放置算法,即在棋盘中放置第几个皇后public int put(int index){//首先判断index是否等于8if(index == 8){//当index等于8的时候,即第9个棋子,已经完成了8个棋子的放置print();//调用输出算法}else{for(int i = 0; i < 8; i++){arr[index] = i;//if(judge(index)){//如果返回true则继续判断put(index + 1);}}}return count;}
}

Java学习之八皇后相关推荐

  1. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  2. Java学习路线图,如何学习Java事半功倍?

    作为一个初学者想掌握Java并不是很容易,Java本身是具有一定难度的,虽然说兴趣这东西可以让我们学习不累,但是有多少人学习是因为兴趣,或者有多少人知道自己的兴趣在哪?所以我很明确的告诉你学习这事本来 ...

  3. Java学习必不可少的网站,快收藏起来

    java技术在IT互联网行业的发展前景一直在提升,越来越多的人都在学习java技术,今天小编来给大家提供一些学习Java的网站集合,希望能够帮助到正在学习java技术的同学. Java学习必不可少的网 ...

  4. 分享五款java学习辅助工具,总有你用的上的~

    想要学好java技术,除了自身的努力,辅助工具也不缺少,辅助工具可以帮助大家在今后的工作中可以提高工作效率,下面小编就来分享五款java学习辅助工具,总有你用的上的~ 五款java学习辅助工具: 1. ...

  5. Java学习从入门到精通的学习建议

    想要学好java技术,首先打好基础很重要,不论学什么基础都是重中之重,学习Java更是如此.如:基础语法.核心类库.面向对象编程.异常.集合.IO流等基础如果学不好,那么后边更深入的语法也不容易学会. ...

  6. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  7. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  8. JAVA学习资源网站

    中文java技术网--http://www.cn-java.com/ 灰狐动力(http://www.huihoo.com/)-- 该站点有许多的开源的项目的介绍和学习,涉及操作系统,数据库等许多方向 ...

  9. 我的WEB之路(一)-2.JAVA学习路线

    第一阶段:针对性夯实JAVA基础 课程名称 核心要点 完成目标 Java基础入门 搭建Java开发和运行环境等,IDE工具的学习和使用,Java语言基础,数据类型,运算符,条件和循环,数组使用等,Ja ...

最新文章

  1. 第四周实践项目2 算法库——单链表
  2. boost::io::ostream_put用法的测试程序
  3. 网络驱动器映射成功但无法更新文件_我的电脑访问NAS像打开本地硬盘那样打开网络NAS...
  4. 宝塔linux 屏蔽ip,宝塔屏蔽国外IP保护网站安全
  5. 月入30K 的电子工程师很常见吗,需要具备啥素质才配得上这个薪资
  6. Linux之VM12+ CentOS7安装以及网络配置
  7. 挥泪告别鼠标,我终究还是学会了Windows快捷键
  8. 时序分析 19 VAR(Vector Autoregression) 向量自回归
  9. 感谢中本聪!也感谢扎克伯格!
  10. PCB小知识(1)-关于打接地孔
  11. R语言 关联规则(二)
  12. 【企业数字化转型】中台战略
  13. CSDN 软件开发新手赛正式启动,召集热爱编程的你
  14. 《管理信息系统(信息管理)》
  15. Cesium-监听地图服务是否加载完成的方法
  16. fatfs文件系统详解之f_read函数分析
  17. 【33】深入理解对象与垃圾回收机制
  18. html中bak是什么文件怎么打开,bak文件怎么打开?小编教你bak文件打开方法
  19. 抛弃WinSCPnbsp;教你使用CuteFTP传输文件
  20. 基于.Net平台C#的微信网页版API

热门文章

  1. 看了我的 MyBatis-Plus 用法,同事也开始悄悄模仿了
  2. 封装:WPF绘制曲线视图
  3. python中 from __future__ import * 的作用
  4. 自定义progressdialog
  5. 3-5 linux 网络文件系统
  6. 分组密码算法与AES算法
  7. 小白篇之京东直播如何用专业设备开始直播(手机端、PC端)
  8. 网闸的理解-python脚本模拟网闸实现
  9. 如何提高课堂教学效率?西安所高校出招了
  10. linux中kill命令默认发出的信号,linux中的kill命令的详细解释