数据结构之递归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 一.八皇后问 ...
随机推荐
- L18 批量归一化和残差网络
批量归一化(BatchNormalization) 对输入的标准化(浅层模型) 处理后的任意一个特征在数据集中所有样本上的均值为0.标准差为1. 标准化处理输入数据使各个特征的分布相近 批量归一化(深 ...
- EOS基础全家桶(八)jungle测试网的使用
简介 前面我们已经学习了一些EOS的基础知识了,但是在EOS主网上的很多操作(比如:抵押.赎回.买卖内存)都是需要EOS链被正式激活后才可使用,而激活EOS链还需要很多的准备操作,我打算在单独的一篇文 ...
- test_HTMLTestRunnerCN.py
代码如下: from calculator import Count import unittest import HTMLTestRunnerCN #测试两个整数相加 class TestAdd(u ...
- vue2.x学习笔记(二十一)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12632730.html. 可复用性&结合-混入 基础 混入(mixin)提供了一种非常灵活的方式,来分发v ...
- Golang交付至Kubernetes
目录 0.前言 1.Go服务构建 1.1.制作Go服务镜像底包 1.2.制作slave基础镜像底包 1.2.1.Golang镜像 1.2.2.Docker镜像 2.创建golang流水线 3.流水线构 ...
- C# LINQ查询之对象
LINQ是一组查询技术的统称,其主要思想是将各种查询功能直接集成到C#语言中,可以对 对象.XML文档.SQL数据库.外部应用程序等进行操作. 这里面讲的简单的几个子句, 必须以from子句开头,以s ...
- JUC并发编程基石AQS之主流程源码解析
前言 由于AQS的源码太过凝练,而且有很多分支比如取消排队.等待条件等,如果把所有的分支在一篇文章的写完可能会看懵,所以这篇文章主要是从正常流程先走一遍,重点不在取消排队等分支,之后会专门写一篇取消排 ...
- 用Python打造电脑人脸屏幕解锁神器附带接头暗号!
前言 最近突然有个奇妙的想法,就是当我对着电脑屏幕的时候,电脑会先识别屏幕上的人脸是否是本人,如果识别是本人的话需要回答电脑说的暗语,答对了才会解锁并且有三次机会.如果都没答对就会发送邮件给我,通知有 ...
- 用SQL查询分析实现类似金蝶K3的收发存明细表
使用SQL查询分析实现类收发存的报表,原始需求在 另外一篇文章 的第四部分.下图是实现需求. 一.准备 删除临时表 [buy]判断是否存在临时表,存在则删除[/buy] if OBJECT_ID('t ...
- 21.SpringCloud实战项目-后台题目类型功能(网关、跨域、路由问题一文搞定)
SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...