数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)
递归
顾名思义,递归就是递归就是递归就是递归就是递归......就是递归
Google递归:
走迷宫(较容易):
构建一个二维数组(如下图),其中1表示围墙,0表示通路,现要求从起点走到终点。利用递归可以以少量代码实现。
由于比较简单,直接上代码分析:
参数 i,j 为迷宫起始坐标,而要走出迷宫,必须绕过围墙1,走迷宫当然有策略,这里比较简单的给出了下右上左的次序判断是否通路,同样也可以上右下左,左上右下,左下右上,注意必须是闭环的,否则绝对走不出迷宫!(这里强烈建议按照代码自己思考走一遍或者debug分析一下)
1 // 下右上左
2 public static boolean setWay(int[][] array, int i, int j) {
3 if (array[6][6] == 7)//判断每一种选择最后是否能走出迷宫
4 return true;
5 else {
6 if (array[i][j] == 0) {
7 array[i][j] = 7;//表示此坐标已经来过,下面接着判断各种情况
8 if (setWay(array, i + 1, j))
9 return true;
10 else if (setWay(array, i, j + 1))
11 return true;
12 else if (setWay(array, i - 1, j))
13 return true;
14 else if (setWay(array, i, j - 1))
15 return true;
16 else {
17 array[i][j] = 3;
18 return false;
19 }
20 } else
21 return false;
22 }
23 }
八皇后:
八皇后小游戏: http://www.4399.com/baidugame/42643.htm 八皇后的规则很简单,但是实现不易,八皇后规定每一个皇后都必须在不同行不同列且不在一个对角线上。
这里给出92种摆法的一部分,感兴趣的朋友可以点击上面连接进行游戏测试
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 public void check(int n) {
2 if (n == max) {
3 print();
4 return;
5 }
6 for (int i = 0; i < max; i++) {
7 array[n] = i;// 这里的i代表列,array[n]代表当前皇后放到第i列
8 if (judge(n)) {// 判断当前皇后n是否满足条件
9 check(n + 1);//满足条件,判断下一个皇后
10 }
11 }
12 }
13
14 //此方法主要判断当前皇后能否摆放
15 public boolean judge(int n) {
16 for (int i = 0; i < n; i++) {// 此处i代表已经摆好的皇后序号,array[i]代表第i个皇后所在的列数, n代表当前的皇后,array[n]代表当前皇后所在的列数
17 //将当前第n个皇后的列array[n]和前n个皇后的列进行比较,还有斜率比较
18 if (array[n] == array[i] || Math.abs(n - i) == Math.abs(array[n] - array[i]))
19 return false;
20 }
21 return true;
22 }
汉诺塔(分治法):
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

以上示图分析,以3片为例,一共需要移动7次。
思路分析:将所有片看作两部分,最底下一片和上面所有片;接着将上面所有片分为两部分,最底下一片和上面所有片......
1、将所有上层片,从A放到B位置上
2、然后剩余最底下的一片,从A放到C位置上
3、接着将B盘中所有片放到C位置上
以上是宏观上的步骤,而真正移动是在回溯的时候。用图说明一下:
方法在执行的时候是按照栈帧执行的,下面也就是模拟了一遍3片的执行过程。
1 //参数说明:num表示有多少片,abc依次表示三个容器
2 public static void hanoitower(int num,char a,char b,char c){
3 if (num==1)
4 System.out.println("第1个盘从"+a+"->"+c);//
5 else {
6 //2个及多个盘子:第一步将其分成两部分:最下面的和所有上层的;
7 hanoitower( num-1,a,c,b );//第一步将上层所有的盘子放到B位置,递归直到上层为1
8 System.out.println("第"+num+"个盘从"+a+"->"+c);//将所有相对于处于下层的盘子一个一个放到C
9 hanoitower( num-1,b,a,c );//将B中的所有盘子,放到C位置上,完成
10 }
11 }
数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)的更多相关文章
- "递归"实现"约瑟夫环","汉诺塔"
一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开 ...
- 用函数递归的方法解决古印度汉诺塔hanoi问题
问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规 ...
- 汉诺塔算法的递归与非递归的C以及C++源代码
汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...
- 汉诺塔算法c++源代码(递归与非递归)[转]
算法介绍: 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n - 1(有兴趣的可以自己证明试试看).后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了.首先把三根柱 ...
- [Python3 练习] 005 汉诺塔1 递归解法
题目:汉诺塔 I (1) 描述 传说,在世界中心贝拿勒斯(在印度北部)的圣庙外有左中右三根足够长的柱子(塔) 左边柱子上套着 64 片金片,金片按"上小下大"排,其余两根是空柱子 ...
- PTA 汉诺塔的非递归实现(C 语言)
借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c), 即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”), 并保证每个移动符合汉诺塔问题的要求 ...
- JAVA递归算法及经典递归例子 对于这个汉诺塔问题
前言:递归(recursion):递归满足2个条件 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 第一题:汉诺塔 对于这个汉诺塔问题,在写递归时,我们只需要确定两个条件: ...
- hanoi(汉诺塔)递归实现
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序 ...
- C语言数据结构----递归的应用(八皇后问题的具体流程)
本节主要讲八皇后问题的基本规则和递归回溯算法的实现以及具体的代码实现和代码分析. 转载请注明出处.http://write.blog.csdn.net/postedit/10813257 一.八皇后问 ...
随机推荐
- java 的 数字、汉字 和 字母 的所占字节长度 与 字符长度 (邮件限制50个汉字)
public static void main(String[] args) { String a = "餿餿餿餿餿z"; byte[] bytes = a.getBytes( ...
- windows powershell校验下载的文件MD5和SHA1值
Windows自带MD5 SHA1 SHA256命令行工具 certutil -hashfile <文件名> <hash类型> 打开windows powershell,进入到 ...
- D - Yet Another Monster Killing Problem
题目连接: https://codeforces.com/contest/1257/problem/D 题目大意: n个怪兽,m个英雄,每个怪兽有一定的能力值,每个英雄有一定的能力值和一定的耐力值.耐 ...
- 程序选择结构if和switch的定义以及使用方法
什么是if选择结构 if选择结构是根据条件判断之后在做处理 基本的if选择结构的语法 if(条件){//条件为真则执行代码1,否则不执行 //代码块1 } if-else选择结构 为什么使 ...
- Python最佳工程实践,建立一个完美的工程项目
在程序开发时候一套好的开发环境和工具栈,可以帮我们极大的提高开发的效率,避免把大量时间浪费在周边琐事上.本文以Python为例,教大家如何快速打造完美的Python项目开发环境:内容涵盖了模块依赖管理 ...
- Git 简明手册
0,Git 是什么 Git 是一个VCS(Version Control System),即版本控制系统. 版本控制系统从字面意思来看,它的用途就是管理/控制文件的版本.使用它,可以方便的知道一个文件 ...
- 自动获取时间html代码
<button type="button" onclick="document.getElementById('demo').innerHTML = Date()& ...
- 【Linux题目】第六关
[定时任务规则] 1. 如果在某用户的crontab文件中有以下记录,该行中的命令多久执行一次(RHCE考试题)?( ) 30 4 * * 3 mycmd A. 每小时. B. 每周. C. 每年三月 ...
- 再也不用c刷题了!!——c++刷题必备
致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于困惑的读者.由于水平有限,博客中难免会有一些错误 ...
- 1月份中国综合PMI指数为53.2% 企业生产经营活动总体增速加快
中新社北京1月31日电 (记者 王恩博)中国国家统计局31日发布数据显示,2019年1月份,中国综合PMI产出指数为53.2%,比上月上升0.6个百分点,表明中国企业生产经营活动总体增速加快. 其中, ...