`
hengjie10
  • 浏览: 24188 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hanoi塔

 
阅读更多

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;

  若n为奇数,按顺时针方向依次摆放 A C B。
  (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
  (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
  (3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。
  所以结果非常简单,就是按照移动规则向一个方向移动金片:
  如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

我用的是递归,代码如下:

#include"iostream.h"
void move(char e,char f);
void hanoi(int n,char a,char b,char c);
int main()
{
   int n;
   cout<<"请输入圆盘的个数"<<endl;
   cin>>n;
   hanoi(n,'A','B','C');
   return 0;
}
void hanoi(int n,char a,char b,char c)
{
   if(n==1)
     move(a,c);
   else
    {
      hanoi(n-1,a,c,b);
      move(a,c);
      hanoi(n-1,b,a,c);
    }
}
void move(char e,char f)
{
   cout<<e<<"------>"<<f<<endl;
}


分享到:
评论

相关推荐

    hutc-双色Hanoi塔问题 参考代码

    ### hutc-双色Hanoi塔问题参考代码详解 #### Hanoi塔问题简介 汉诺塔(Hanoi Tower)问题是一种经典的递归算法问题,在计算机科学领域被广泛用于教授递归概念。传统的汉诺塔问题涉及到三个柱子及不同大小的盘子,...

    Hanoi塔问题的一种非递归算法

    ### Hanoi塔问题的一种非递归算法:深入解析与实现 #### 一、引言 Hanoi塔问题作为计算机科学领域内经典的递归问题之一,因其简洁性和挑战性而广受关注。通常,Hanoi塔问题的解决方案多采用递归算法,尽管其逻辑...

    hanoi塔非递归.rar

    在提供的压缩包文件“hanoi塔”中,可能包含了两种实现方式的源代码,一种是非递归,另一种是递归。递归算法通常通过一个递归函数实现,该函数接收盘子的数量、起始柱子、目标柱子和辅助柱子作为参数。函数内部会...

    hanoi塔问题 hanoi塔问题

    哈诺伊塔问题中的日期处理与存储过程设计 在哈诺伊塔问题中,我们遇到了日期处理和存储过程设计的问题。下面,我们将详细地剖析这两个问题,并提供相应的解决方案。 一、日期处理 在日期处理中,我们需要计算每个...

    Hanoi塔问题的一个公式解

    ### Hanoi塔问题的一个公式解 #### 摘要与背景 Hanoi塔问题自1883年由法国数学家Édouard Lucas首次发明以来,一直是数学、计算机科学及认知科学领域内的经典问题之一。该问题最初的形式是拥有三个柱子(标记为1、...

    hanoi塔图形演示程序java源码

    hanoi塔 java 图形 演示程序 hanoi塔 java 图形 演示程序 hanoi塔 java 图形 演示程序 hanoi塔 java 图形 演示程序

    Hanoi塔问题非递归算法的形式推导

    ### Hanoi塔问题非递归算法的形式推导 #### 一、引言 Hanoi塔问题,也称为汉诺塔问题,是一个经典的递归问题。传统上,人们使用递归算法来解决这个问题,因为它的递归性质使得问题的解决变得直观而简单。然而,...

    双色Hanoi塔问题参考代码

    汉诺塔(Hanoi Tower)问题是一个经典的递归问题,起源于一个古老的印度传说。传说中,寺庙中的僧侣们需要将64个金盘从一个塔座移动到另一个塔座上,中间可以借助第三个塔座,但必须遵守特定的规则。传统的汉诺塔...

    HANOI塔问题的非递归解

    ### HANOI塔问题的非递归解 #### 背景与介绍 汉诺塔(Hanoi Tower)是一个经典的递归问题,在计算机科学中被广泛用于教学递归概念。传统上,这个问题通过递归算法解决,即一个函数在执行过程中调用自身的方式解决...

    [转帖] 用C# Generator解决Hanoi塔问题

    【标题】:“用C# Generator解决Hanoi塔问题”揭示了如何使用C#编程语言来构建一个自动化生成器,以高效地处理经典的汉诺塔问题。汉诺塔问题是一个著名的递归问题,它涉及到将一组盘子从一根柱子移动到另一根柱子,...

    Hanoi塔算法动态演示系统的设计

    《Hanoi塔算法动态演示系统的设计》是一篇深入探讨如何在B/S(Browser/Server)架构下,利用VC++.NET技术实现Hanoi塔算法动态演示的教学辅助系统的文章。该系统旨在提升计算机科学教育中的交互性和可视化程度,使...

    hanoi塔问题--数据结构与算法必备

    hanoi塔问题--数据结构与算法必备,学习数据结构与算法始终要掌握的,希望对你能有所帮助!

    形式化开发Hanoi塔问题非递归算法

    Hanoi塔问题非递归算法的形式化开发,涉及到一系列计算机科学和数学领域的知识点,尤其是形式化方法、算法设计、递归与迭代、以及循环不变式等方面。Hanoi塔问题也被称为汉诺塔问题,是计算理论领域的一个经典问题,...

    hanoi塔非递归

    汉诺塔问题通常设定为三个塔,即A、B、C塔,其目标是将C塔上的n个大小不一的碟子按顺序移动到B塔上,规则要求每次只能移动一个碟子,并且在移动过程中大盘子不能放置在小盘子之上。传统的递归解法通过将问题分解为更...

    Hanoi塔的C#图形化实现

    在汉诺塔问题中,我们将一个塔上的所有盘子移动到另一个塔上,可以分解为三个基本操作:首先,将上面的n-1个盘子借助第三个塔移动到目标塔;然后,将最底层的盘子直接移动到目标塔;最后,再将暂存于第三个塔上的n-1...

    双色Hanoi塔问题

    Description A、B、C 是3个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上, 由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。...

    Hanoi塔演示 for JAVA

    《Hanoi塔演示在JAVA中的实现》 Hanoi塔是一个经典的递归问题,它源于一个传说中的游戏,涉及三根柱子和一堆盘子。在这个游戏中,目标是将所有盘子从第一根柱子(源柱)移动到第三根柱子(目标柱),每次只能移动一...

    Hanoi塔 可视化程序源码(C#)

    1. `HanoiTower` 类:这是整个程序的核心,包含了汉诺塔问题的解法,以及与用户界面交互的方法。 2. `DiskControl` 类:这个自定义控件代表圆盘,包含绘制圆盘的逻辑和响应鼠标事件的方法。 3. `MainForm` 类:作为...

    设计一个HANOI塔程序 汇编语言程序设计 课程设计

    汉诺塔(Hanoi Tower)程序是一个经典的递归问题,其目标是将一个柱子上的所有盘子通过另外两个柱子的帮助,按照大小顺序移动到第三个柱子上。在这个课程设计中,你将使用汇编语言来实现这个算法。汇编语言是一种...

Global site tag (gtag.js) - Google Analytics