汉诺塔(Hanoi)——小小算法
传送门: 袁咩咩的小小博客
汉诺(Hanoi)塔源于古印度,是非常著名的智力趣题,大意如下:
勃拉玛是古印度的一个开天辟地的神,其在一个庙宇中留下了三根金刚石的棒,第一
根上面套着64个大小不一的圆形金片。其中,最大的金片在最底下,其余的依次叠上
去,且一个比一个小。勃拉玛要求众僧将该金刚石棒中的金片逐个地移动到另一根棒
上,规定:
一次只能移动一个金片,且金片在放到棒上时,只能大的放在小的下面,但是可以利用中间的一根棒最为辅助。
问题分析
从上至下,我将盘一次标号为1、2、3......
- 当只有一个盘的时候,只需要将其从A棒移动至C棒;
步骤:
1号:A ——> C
- 当有两个盘时,需要先将第一个盘移动至B棒,再将第二个盘移动至C棒,再将第一个盘移动至C棒;
步骤:
1号:A ——> B
2号:A ——> C
1号:B ——> C
- 当有3个盘子时,需要进行的步骤为:
1号:A ——> C
2号:A ——> B
1号:C ——> B
3号:A ——> C
1号:B ——> A
2号:B ——> C
1号:A ——> C
可以看出,当号数与盘子总数相等时,进行的操作只有A ——> C。所以可以将把A棒上的所有盘子借助B棒移动到C棒的整个过程总结为三步:
- 将A棒上的n-1个圆盘借助C棒移动到B棒上
- 将A棒上的一个圆盘移动到C棒上
- 将B棒上的圆盘借助A棒移动到C棒上
当然,当只有一个盘子时只需A ——> C;两个盘子的时候,也不需要中介。
初态:
移动n-1个圆盘:
移动剩下的一个盘:
移动B棒上的盘:
示例代码
package com.yuanyang.example;
import java.util.Scanner;
public class Hanoi {
static long count; //移动的次数
/**
* @param n 盘子总数
* @param a A棒
* @param b B棒
* @param c C棒
* @param disk 用来输出移动的第k个盘子
*/
static void move(int n,char a,char b,char c,int disk){//A棒借助B棒移动到C棒
disk --;
if (n==1) {//当只有一个盘子的时候,直接从A棒移动至C棒
System.out.printf("第%d次移动:\t第%d个盘子,圆盘从%c移动到%c棒\n",++count,disk,a,c);
}else {//当盘子大于一的时候。
move(n-1,a,c,b,disk);//将A棒上的n-1个盘子借助C棒移动到B棒
System.out.printf("第%d次移动:\t第%d个盘子,圆盘从%c移动到%c棒\n",++count,disk,a,c);//将最后一张盘子从A棒移到C棒
move(n-1,b,a,c,disk);//将B棒上剩下的n-1个盘子借助A棒移动到C棒
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入圆盘数:");
int n = input.nextInt();
move(n,'a','b','c',n + 1);
System.out.printf("一共进行了%d次移动\n",count);
}
}
这样,我们就可以得到结果了。但是,可以发现,移动的次数n和盘子数x存在 x = 2^n-1 的关系,所以,当盘子达到64个的时候,次数达到了18446744073709551615次,这就很尴尬了,这群僧人估计搬完是没戏了。
汉诺塔(Hanoi)——小小算法的更多相关文章
- 汉诺塔-Hanoi
1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵 ...
- 汉诺塔 Hanoi Tower
电影<猩球崛起>刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔...... 汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针.印度 ...
- 汉诺塔hanoi
问题描述: 有一个梵塔,塔内有三个座A.B.C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图). 把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中 ...
- 关于C语言解决汉诺塔(hanoi)问题
C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...
- 【Python学习之七】递归——汉诺塔问题的算法理解
汉诺塔问题 汉诺塔的移动可以用递归函数非常简单地实现.请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的 ...
- 用函数递归的方法解决古印度汉诺塔hanoi问题
问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规 ...
- python编写汉诺塔 Hanoi
#hanoi.py count = 0 def hanoi(n, src, dst, mid): #src为原1号柱子 dst 目标3号柱子 mid中间2号过渡柱子 global count #对全局 ...
- PHP实现的解汉诺塔问题算法示例
问题描述: 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如下图).游戏的目标:把A杆 ...
- HDU汉诺塔系列
这几天刷了杭电的汉诺塔一套,来写写题解. HDU1207 汉诺塔II HDU1995 汉诺塔V HDU1996 汉诺塔VI HDU1997 汉诺塔VII HDU2064 汉诺塔III HDU2077 ...
随机推荐
- JDBC连接数据库(一)
原文地址http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个步 ...
- activiti整合spring
activiti的配置文件其实就是一份spring的配置文件,只是默认将processEngineConfiguration做为一个bean来读取. 当和spring进一步整合时,需要使用 Sprin ...
- python中的切片
python中提供了一种很方便的方法来完成取出指定范围内的元素,这种方法就是切片(Slice). 以下为切片的例子: In [1]: L = ['Michael', 'Sarah', 'Tracy', ...
- Educational Codeforces Round 55 (Rated for Div. 2) Solution
A. Vasya and Book Solved. 三种方式取$Min$ #include <bits/stdc++.h> using namespace std; #define ll ...
- CCPC-Wannafly Winter Camp Day3 (Div2, onsite)
Replay Dup4: 没想清楚就动手写? 写了两百行发现没用?想的还是不够仔细啊. 要有莽一莽的精神 X: 感觉今天没啥输出啊, 就推了个公式?抄了个板子, 然后就一直自闭A. 语文差,题目没理解 ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON SetIcon1
zw版[转发·台湾nvp系列Delphi例程]HALCON SetIcon1 procedure TForm1.Button1Click(Sender: TObject);var img : HIma ...
- kylin与superset整合
前提: kylin安装以及配置可以参考 https://www.cnblogs.com/654wangzai321/p/9676204.html 我这边用的Linux自带的python2.7,为了保证 ...
- 20145303刘俊谦《网络对抗》Exp2 后门原理与实践
20145303刘俊谦<网络对抗>Exp2 后门原理与实践 基础问题回答 1.例举你能想到的一个后门进入到你系统中的可能方式? •在网页上浏览不安全的网站或者下载不安全的软件 •通过发送邮 ...
- Ubuntu16.04 安装JDK Tomcat
Ubuntu16.04安装jdk,下载linux中的64版本 需要下载jdk,tomcat安装包 tar.gz版本的 http://pan.baidu.com/s/1mi4WVhA 安装JDK: ho ...
- node scripts/install.js 停顿解决办法
参考:node-sass 安装卡在 node scripts/install.js 解决办法 在安装hexo的时候,运行: npm install hexo-cli -g 卡死在了 node scri ...