传送门: 袁咩咩的小小博客

汉诺(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棒的整个过程总结为三步:

  1. 将A棒上的n-1个圆盘借助C棒移动到B棒上
  2. 将A棒上的一个圆盘移动到C棒上
  3. 将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)——小小算法的更多相关文章

  1. 汉诺塔-Hanoi

    1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵 ...

  2. 汉诺塔 Hanoi Tower

    电影<猩球崛起>刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔...... 汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针.印度 ...

  3. 汉诺塔hanoi

    问题描述: 有一个梵塔,塔内有三个座A.B.C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图). 把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中 ...

  4. 关于C语言解决汉诺塔(hanoi)问题

    C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...

  5. 【Python学习之七】递归——汉诺塔问题的算法理解

    汉诺塔问题 汉诺塔的移动可以用递归函数非常简单地实现.请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的 ...

  6. 用函数递归的方法解决古印度汉诺塔hanoi问题

    问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规 ...

  7. python编写汉诺塔 Hanoi

    #hanoi.py count = 0 def hanoi(n, src, dst, mid): #src为原1号柱子 dst 目标3号柱子 mid中间2号过渡柱子 global count #对全局 ...

  8. PHP实现的解汉诺塔问题算法示例

    问题描述: 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如下图).游戏的目标:把A杆 ...

  9. HDU汉诺塔系列

    这几天刷了杭电的汉诺塔一套,来写写题解. HDU1207 汉诺塔II HDU1995 汉诺塔V HDU1996 汉诺塔VI HDU1997 汉诺塔VII HDU2064 汉诺塔III HDU2077  ...

随机推荐

  1. cocos代码研究(9)ProgressTimer类学习笔记

    理论部分 ProgressTimer是Node的子类. 该类根据百分比来渲染显示内部的Sprite对象. 变化方向包括径向,水平或者垂直方向. 代码部分 Type getType () const获取 ...

  2. java之标记型接口Cloneable

    1.克隆用途. Cloneable和Serializable一样都是标记型接口,它们内部都没有方法和属性,implements Cloneable表示该对象能被克隆,能使用Object.clone() ...

  3. MyBatis—mybatis-config.xml模板

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC & ...

  4. spring AOP的注解实例

    上一篇写了spring AOP 的两种代理,这里开始AOP的实现了,个人喜欢用注解方式,原因是相对于XML方式注解方式更灵活,更强大,更可扩展.所以XML方式的AOP实现就被我抛弃了. 实现Sprin ...

  5. STM32 IO口双向问题

    源: STM32 IO口双向问题

  6. Vue学习笔记之Vue的箭头函数

    0x00 箭头函数 基本语法: ES6允许使用“箭头”(=>)定义函数 var f = a = > a //等同于 var f = function(a){ return a; } 如果箭 ...

  7. Gym - 101334C 3514 无向仙人掌

    http://codeforces.com/gym/101334/attachments 题意: 判断是否是仙人掌图并且连通,如果是的话则计算出它有多少个连通子图也是仙人掌. 思路:连通子图也就是我们 ...

  8. POJ 1034 The dog task(二分图匹配)

    http://poj.org/problem?id=1034 题意: 猎人和狗一起出去,狗的速度是猎人的两倍,给出猎人的路径坐标,除了这些坐标外,地图上还有一些有趣的点,而我们的狗,就是要尽量去多的有 ...

  9. ubuntu 14.04 (desktop amd 64) 查看配置参数

    硬盘型号 sudo hdparm -i /dev/sda |grep "Model"   硬盘数量大小 sudo fdisk -l |grep "Disk /dev/sd ...

  10. shell 脚本sed替换文件中某个字符串

    有些大文件,特别的大.有几百兆,甚至更大. 用文本编辑器打开十分的费劲,电脑都卡死了. 想替换其中的字符串,很麻烦. 这个时候有了shell,简直强大到爆炸! # du -h user.sql 304 ...