`
qzww5324
  • 浏览: 37992 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

汉诺塔(Hanoi)

阅读更多

      汉诺塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内(Hanoi)为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小 至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当 盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。     

      以三根柱子A,B,C为例,初始情况下,在A上有n个盘子。

逐步分析n在不同情况时的操作步骤。

 

当n=1时: 将盘子从A 移到 C (A->C) 完成移动。

当n=2时: (1)将n-1(即 1)个盘子从A移动到B;

                (2)将A上最后一个盘子从A移动到C;

                (3)将B上的盘子移动到C上 完成移动;

当n=3时: (1)将n-1(即 2)个盘子从A移动到B(借助C)

                       具体步骤:(a)假设 要从A移动的n-1个盘子为 m,将 m-1(即 1)个盘子从A移动到C;

                                     (b)将m个盘子中剩余的盘子(这里 剩余1个)从A移动到B;

                                     (c)将C上的那个盘子移动到B,完成移动;

                (2)将A上最后一个盘子从A移动到C;

                (3)将B上剩余的盘子移动到C(借助A)

                        具体步骤:(a)同样假设B上要移动的盘子数为m,将 m-1个盘子从B移动到A;

                                      (b)将m个盘子中剩余的盘子(这里 剩余1个)从B移动到C;

                                      (c)将A上的那个盘子移动到C,完成移动;

 

 

总结以上的步骤,当n>1时,操作步骤都可以分为三大步,而n>2时1,3两个步骤又都包含了三个类似的步骤,不同的地方仅在 移动的起始点(A),借助点(B)和 目的点 (C),以这三个值做为参数,再加上盘子数,可用以下代码表示。

 

public class Hanoi {
	 public static void main(String args[]) throws IOException {
	        int n;
	        BufferedReader buf;
	        buf = new BufferedReader(new InputStreamReader(System.in));

	        System.out.print("请输入盘数:");
	        n = Integer.parseInt(buf.readLine());

	        Hanoi hanoi = new Hanoi();
	        hanoi.move(n, 'A', 'B', 'C');
	    }

	    public void move(int n, char a, char b, char c) {
	        if(n == 1)
	        	//从a,移到 c
	            System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
	        else {
	        	//从a,借助c,移到 b
	            move(n - 1, a, c, b);
	            //从a,移到 c
	            System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
	            //从b,借助a,移到 c
	            move(n - 1, b, a, c);
	        }
	    }
}

 

以3个盘子为例 输出结果:

请输入盘数:3
盘 1 由 A 移至 C
盘 2 由 A 移至 B
盘 1 由 C 移至 B
盘 3 由 A 移至 C
盘 1 由 B 移至 A
盘 2 由 B 移至 C
盘 1 由 A 移至 C
 

 

 

 

 

 

分享到:
评论

相关推荐

    最新最精彩汉诺塔HanoiTower

    总的来说,"最新最精彩汉诺塔HanoiTower"是一款利用C++编程语言并结合多线程技术开发的汉诺塔游戏,具有丰富的图形界面和动态调速功能,支持多达32个盘子的挑战,旨在为用户提供一种既有趣又有挑战性的娱乐体验。...

    python编程小游戏汉诺塔hanoi

    这是使用python语言编程的小游戏,汉诺塔hanoi,欢迎大家下载

    汉诺塔 hanoi C代码

    汉诺塔游戏是一种经典的递归问题,源自印度的古老传说,通常用三根柱子(A、B、C)和一堆大小不一的圆盘来表示。在这个游戏中,目标是将所有圆盘从柱子A移动到柱子C,但每次只能移动一个圆盘,并且任何时候大盘子都...

    C#图形界面汉诺塔Hanoi

    汉诺塔(Hanoi)游戏是一个经典的递归问题,它涉及到三个柱子和一堆不同大小的圆盘。玩家需要将所有圆盘从一个柱子移动到另一个柱子,每次只能移动一个圆盘,并且任何时候大盘子都不能位于小盘子之上。在C#环境下,...

    MFC 汉诺塔 hanoi

    汉诺塔(Hanoi Tower)是一个经典的递归问题,源于19世纪的法国数学家艾德蒙·朗利。在MFC(Microsoft Foundation Classes)框架下实现汉诺塔游戏,可以提供一个直观的用户界面,让用户通过鼠标操作来解决这个问题。...

    汉诺塔 hanoi.cpp 用C++实现

    void hanoi(int n,char a,char b,char c) 实现汉诺塔的程序,用递归.

    汉诺塔 Hanoi

    汉诺塔(Hanoi)问题,也称为艾斯特拉达问题或移塔问题,是一个经典的递归算法问题,源于19世纪由法国数学家艾德蒙·朗利所提出。问题的目标是将一个堆栈中的所有盘子,通过三个柱子在有限步骤内从初始柱子A移动到...

    汉诺塔的递归算法 C++

    用C++实现汉诺塔的递归算法,定义了类和方法。

    汉诺塔 (hanoi) c++

    汉诺塔(Hanoi Tower)是一个经典的递归问题,它涉及到三个柱子和一堆不同大小的圆盘。问题的目标是将所有圆盘从一个柱子(通常称为起始柱或A柱)移动到另一个柱子(目标柱或C柱),但每次只能移动一个圆盘,并且...

    10_05 V4 (汉诺(Hanoi)塔问题).cpp

    汉诺(Hanoi)塔问题

    汉诺塔 hanoi

    汉诺塔, 用递归实现,递归里面的经典问题。问题是源于印度一个古老传说的益智玩具

    汉诺塔_Hanoi_

    汉诺塔(Hanoi)问题是一个经典的递归问题,源于法国数学家爱德华·卢卡斯在19世纪末提出的智力游戏。这个游戏涉及到三根柱子和一堆大小不一的圆盘,每根柱子上可以放置圆盘。游戏的目标是将所有圆盘从第一根柱子...

    汉诺塔(hanoi)

    汉诺塔(Hanoi Tower)是一个经典的递归问题,源于19世纪法国数学家爱德华·卢卡斯提出的智力游戏。游戏的目标是将一座由大小不等的圆盘堆叠而成的塔从一个柱子(起始柱)移动到另一个柱子(目标柱),在移动过程中...

    汉诺塔 源代码 -汉诺塔小程序

    ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码---

    汉诺塔演示程序(包含二叉树的演示动画)

    汉诺塔演示程序结合了二叉树的演示动画,为学习和理解这两种计算机科学基础知识提供了一个生动直观的方式。首先,我们来深入探讨一下汉诺塔问题及其解决方案。 汉诺塔是一个经典的递归问题,由三个柱子和一堆大小...

    汉诺塔演示程序 HanoiTower

    汉诺塔(Hanoi Tower)演示程序是一款基于Visual Studio(VS)平台,使用C++编程语言编写的软件。它提供了一个交互式的环境,用于理解和学习经典的汉诺塔问题。汉诺塔问题是一个著名的数学和计算机科学问题,由三个...

    flash小游戏汉诺塔-Flash文档类资源

    汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自19世纪由法国数学家艾德蒙·洛卡特(Edouard Lucas)提出的数学问题。它通常由三根圆柱和一堆不同大小的圆盘组成,玩家的目标是将所有圆盘从一根柱子移动到另一根...

    java实现汉诺塔演示及手动操作汉诺塔

    汉诺塔是一个经典的递归问题,它源自一个古老的印度传说。在这个问题中,有三个柱子和一堆不同大小的圆盘,目标是将所有圆盘从一个柱子移动到另一个柱子,遵循以下规则: 1. 一次只能移动一个圆盘。 2. 不允许将大...

    flash小游戏汉诺塔

    汉诺塔(Hanoi Tower)是一款经典的逻辑益智游戏,起源于19世纪末的法国,由数学家爱德华·卢卡斯提出。在这个游戏中,有三根柱子和一堆大小不一的圆盘,起初都堆在第一根柱子上,按照从大到小的顺序自下而上排列。...

    汉诺塔(hanoi)代码(输出移动过程)

    汉诺塔 vc6编译,输入要挪动的盘子数,输出搬运过程。

Global site tag (gtag.js) - Google Analytics