相关介绍:

 汉诺塔问题是一个通过隐式使用递归栈来进行实现的一个经典问题,该问题最早的发明人是法国数学家爱德华·卢卡斯。传说印度某间寺院有三根柱子,上串64个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。若传说属实,僧侣们需要2^64 − 1步才能完成这个任务;若他们每秒可完成一个盘子的移动,就需要5845亿年才能完成。整个宇宙现在也不过137亿年。这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南的河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定。佛教中确实有“浮屠”(塔)这种建筑;有些浮屠亦遵守上述规则而建。“汉诺塔”一名可能是由中南半岛在殖民时期传入欧洲的。

 其问题的形式化描述如下:假设有3个分别命名为X,Y,Z的塔座,在塔座X上插有n个直径大小各不相同,且从小到大编号为1、2、......、n的圆盘。现要求将塔座X上的n个圆盘借助塔座Y移至塔座Z上,并仍按同样顺序叠排。圆盘移动时必须遵守以下的规则:

  1. 每次只能移动一个圆盘
  2. 圆盘可以插在X、Y和Z中的任意一个塔座上
  3. 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

问题分析:

 当n=1时,问题较为简单,只要将编号为1的圆盘从塔座X直接移动到塔座Z上即可;当n>1时,需利用塔座Y作辅助塔座,若能先设法将压在编号为n的圆盘上的n-1个圆盘从塔座X移动到塔座Y上,则可将编号为n的圆盘从塔座X移动至塔座Z上,然后将塔座Y上的n-1个圆盘移至塔座Z上。而如何将n-1个圆盘从一个塔座移动至另一个塔座是一个和原问题具有相同特征属性的问题,只是问题的规模小于1,因此可以用同样的办法进行求解。由此可知,求解n阶汉诺塔问题可以用递归分解的方法来进行。

示例代码如下:

package queueandstack;
/**
* 该类用于解决汉诺塔问题
* @author 学徒
*
*/
public class Hanoi
{
//用于搬动次数的记录
private int c=0;
/**
* 将塔座x上按照直径由小到大且自上而下的编号为1至n的n个圆盘按照规则移到塔座z上,y用作辅助塔座
* @param n 圆盘的数目
* @param x 原塔座
* @param y 辅助塔座
* @param z 目标塔座
*/
public void hanoi(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z);//将编号为1的圆盘从x移动到z
else
{
hanoi(n-1,x,z,y);//将x上编号为1到n-1的圆盘移动到y,z做辅助塔座
move(x,n,z);//将编号为n的圆盘从x移动到z
hanoi(n-1,y,x,z);//将y上编号为1至n-1的圆盘移动到z,x做辅助塔座
}
}
/**
* 用于移动操作
* @param x 原塔座
* @param n 圆盘编号
* @param z 目标塔座
*/
public void move(char x,int n,char z)
{
System.out.println("第"+(++c)+"次移动:"+n+"号圆盘,"+x+"->"+z);
} public static void main(String[] args)
{
Hanoi n=new Hanoi();
n.hanoi(3, 'x', 'y', 'z');//对圆盘数量为3进行移动
}
} 运行结果:
第1次移动:1号圆盘,x->z
第2次移动:2号圆盘,x->y
第3次移动:1号圆盘,z->y
第4次移动:3号圆盘,x->z
第5次移动:1号圆盘,y->x
第6次移动:2号圆盘,y->z
第7次移动:1号圆盘,x->z

-------------->以上内容大部分来自教材《数据结构》,清华大学出版社

其移动情况的示例图如下:

回到目录|·(工)·)

K:汉诺塔问题的更多相关文章

  1. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  2. fzu1036四塔问题(汉诺塔问题拓展)

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; ]; int ru ...

  3. codevs3145 汉诺塔问题

    难度等级:白银 3145 汉诺塔问题 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一 ...

  4. 新版汉诺塔(UVa10795 - A Different Task)

    题目介绍: 标准的汉诺塔上有n个大小各异的盘子.现给定一个初始局面(见图1),求它到目标局面(见图2)至少需要移动多少步? 移动规则:一次只能移动一个盘子:且在移动盘子之前,必须把压在上面的其他盘子先 ...

  5. Hanio汉诺塔代码递归实现

    1.背景介绍 Hanio (汉诺塔,又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  6. 【C语言】汉诺塔问题

    之前遇见这个问题,非常费劲地理解了,并写出代码,然后过段时间,再遇见这个问题,又卡住了,如此反反复复两三次,才发现自己对递归的理解依然很肤浅.今天无聊,重温<算法:c语言实现>一书,又遇见 ...

  7. [CareerCup] 3.4 Towers of Hanoi 汉诺塔

    3.4 In the classic problem of the Towers of Hanoi, you have 3 towers and N disks of different sizes ...

  8. 【BZOJ 1019】【SHOI2008】汉诺塔(待定系数法递推)

    1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 559  Solved: 341[Submit][Status] ...

  9. 【BZOJ】1019: [SHOI2008]汉诺塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1019 题意:汉诺塔规则,只不过盘子n<=30,终点在B柱或C柱,每一次移动要遵守规则:1.小的 ...

随机推荐

  1. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option)

    今天运行Redis时发生错误,错误信息如下: org.springframework.dao.InvalidDataAccessApiUsageException: MISCONF Redis is ...

  2. 总结day3 ---- 进制转换,字符串切片,字符串常用方法.,for 循环,

    前情提要: int 的相关操作 进制转换 bit_lenth() str 的索引,以及常用的相关方法 for 循环 索引 切片 相关方法 一  : int 的相关操作 int 主要用于生活中的计算问题 ...

  3. 架构师养成记--23.sigar使用实例

    作用是检测机器的硬件环境 注意在jdk的bin目录下加上sigar的lib目录中的文件 import java.net.InetAddress; import java.net.UnknownHost ...

  4. Visual Studio进行负载测试,RIG和负载测试术语- Part II

    对于一个多用户的应用程序,性能是非常重要的.性能不仅是执行的速度,它包括负载和并发方面.Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual S ...

  5. asp.net图片上传代码

    前端: <form action="/ImageUpload.ashx" method="post" enctype="multipart/fo ...

  6. 禅道与bugfree区别

    bugfree更偏重bug管理, 禅道是以项目管理为目标, 所以出发点不一样. 我们bug追踪管理使用bugfree,项目管理计划使用禅道,配置管理使用svn bugfree很low,安装需要环境特别 ...

  7. [Re:从零开始的分布式] 0.x——分布式基础概念

    分布式的特点 1. 分布式 2. 对等性 3. 并发性 4. 缺乏全局时钟 5. 故障总是会发生 分布式环境的问题 1. 网络不可靠 2. 网络分区 3. 节点故障 CAP理论 一致性 可用性 分区容 ...

  8. 【系统】Ubuntu和win7双系统更改系统引导菜单

    1. 下载EasyBCD 2. 编辑菜单选项以及重写MBR

  9. 使用nginx反向代理jenkins

    1.在Jenkins 官方网站(http://jenkins-ci.org/)下载最新版本war包.拷贝到 $TOMCAT_HOME/webapps 下(不用解压).启动tomcat服务. 2.找到n ...

  10. JavaScript数据结构-17.图结构

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...