`
lovnet
  • 浏览: 6881351 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

汉诺塔算法思想

 
阅读更多

问题描述

一说到递归可能就会想到最经典的汉诺塔问题.

先把汉诺塔问题简短的描述下.假如有start ,tmp , end三个柱子.

1.初始条件.最开始是tmp和end为空,而start上面有按从大到小往上摆的盘子(塔状).

2.最终目标.实现把所有盘子放到end柱子上,顺序跟之前的start柱子一样.从大到小往上的塔状形.

3.限制条件.我们在搬动的时候可以把tmp柱子拿来临时用下,不过在搬动的任何时候不能出现小盘到大盘上面的情况.

解决思路

我们先考虑最简单的情况,假如只有一个盘子,就直接从start搬到目的地end.如果两个盘子则是先把小盘子放tmp,然后大盘子放end,最后再把tmp里的盘子放end.

假如有N个盘子时,我们可以这样想,底下最大的那个我们先不管.(因为最大的如果你把它放那不动,则可以无视它的,其他盘子可以在三个柱子上移来移去.它是最大嘛).

于是我们可以先想办法把start上的N-1个盘子搬到tmp上,然后把最大的那个搬end上,最后再想办法把tmp上的N-1个搬到end上.

于是当有盘子3个时,先把上面2个搬到tmp上,再把最大那个搬到end,最后再想办法把tmp上的2个搬end上来.

C++实现代码

#include "stdafx.h"

#include <iostream>

#include <string>

using namespace std;

int totalSteps = 0; //用来计算所有操作总数是多少

//下面这个函数就是算出具体步骤的

void Hanoi(int totalNum, string start, string tmp, string end)

{

if(totalNum == 1)

{

//如果只有一个盘了,则直接从开始的start柱子搬到目的柱子end

string stepInfo = "Move disk from " + start + " to " + end;

cout<<stepInfo<<endl;

totalSteps++;

}

else

{

Hanoi(totalNum - 1, start,end, tmp); //步骤1.先把start上的totalNum - 1个盘子搬到tmp上

string stepInfo = "Move disk from " + start + " to " + end; //步骤2.把start上剩下的那大那个盘子直接盘end柱子上

cout<<stepInfo<<endl;

totalSteps++;

Hanoi(totalNum - 1, tmp, start, end); //步骤3.把tmp柱子上totalNum -1个盘子搬到end柱子上

}

}

int main()

{

int totalDiskNum = 4;

Hanoi(totalDiskNum, "start", "tmp", "end");

cout<<totalSteps<<endl; //结果是15

return 0;

}

总的步骤数规律是2^N - 1.其中N是盘子总数

所以N为4时,2的4次方为16,减1就是15

分享到:
评论

相关推荐

    汉诺塔问题算法以及实现

    汉诺塔问题是一个经典的递归算法案例,它不仅在计算机科学领域有着广泛的应用,同时也被用来教授递归思想的基础知识。这个问题最早由法国数学家Édouard Lucas于1883年提出,并以其发明者的名字命名。汉诺塔问题涉及...

    数据结构 汉诺塔算法

    ### 数据结构与汉诺塔算法...掌握汉诺塔算法不仅可以提高编程技巧,还能加深对递归思想的理解。 以上代码提供了不同语言下的实现方式,帮助读者理解和实践汉诺塔算法。无论是初学者还是有经验的开发者,都能从中获益。

    汉诺塔层次迭代算法和分析

    ### 汉诺塔问题迭代算法与分析 #### 引言 汉诺塔问题是一个经典的计算机科学问题,通常被用来教授递归的概念。长久以来,人们普遍认为递归是解决汉诺塔问题的最佳方法。然而,近年来研究者们发现迭代算法也可以...

    c语言汉诺塔算法,递归,非递归

    汉诺塔(Hanoi Tower)问题是一个经典的计算机科学问题,源于19世纪末法国数学家爱德华·卢卡斯提出的一个智力游戏。...通过汉诺塔问题的学习,我们可以更好地运用递归思想,解决现实世界中的诸多挑战。

    汉诺塔算法教学源码,给出了计算结果和塔盘移动过程

    描述中的"给出了计算结果和塔盘移动过程"意味着这个源码不仅实现了汉诺塔算法,还可能包含可视化界面,能够动态显示每个步骤,帮助初学者更好地理解这个过程。通过这样的可视化演示,用户可以直观地看到每个圆盘的...

    C经典算法之双色汉诺塔

    #### 双色汉诺塔算法解析 双色汉诺塔(Two-color Hanoi Tower)是基于传统汉诺塔游戏的一种变体。传统汉诺塔游戏由三个柱子及不同大小的圆盘组成,玩家的目标是将所有圆盘从初始柱子移动到目标柱子上,且每次只能...

    汉诺塔算法

    汉诺塔算法,又称为汉诺塔问题,是一种经典的递归问题,源于印度的一个古老传说。该问题涉及三根柱子A、B、C,以及若干个大小不一的穿孔圆盘,初始时所有圆盘按照从大到小的顺序堆叠在柱子A上。目标是将所有圆盘按照...

    汉诺塔递归算法--C语言

    总的来说,汉诺塔问题展示了递归思想在解决复杂问题中的应用,同时也提醒我们在面对指数级增长的问题时,要考虑算法的时间复杂度和潜在的优化策略。通过将递归转换为循环,我们可以降低程序的运行成本,提高效率。

    flash小游戏汉诺塔

    汉诺塔游戏不仅锻炼玩家的逻辑思维能力,也常常被用于计算机科学的教学,因为它展示了递归算法的应用。 Flash小游戏是一种基于Adobe Flash技术的互动娱乐形式,它可以在网页上直接运行,无需安装额外软件。这种游戏...

    archive_VC++汉诺塔算法.zip.zip

    在C语言和游戏编程中,实现汉诺塔算法可以帮助开发者理解递归思想和解决问题的能力。在这个名为"archive_VC++汉诺塔算法.zip.zip"的压缩包中,包含了一个VC++编写的汉诺塔算法实现,以及一个名为"output.txt"的文件...

    简单的汉诺塔html网页游戏

    汉诺塔游戏是一种基于递归算法的经典逻辑游戏,源自印度古老传说,由法国数学家爱德华·卢卡斯在19世纪末正式提出。在这个简单的汉诺塔HTML网页游戏中,玩家将体验到如何通过一系列合法移动将全部圆盘从一根柱子...

    软件算法之汉诺塔动画演示

    汉诺塔游戏是一种经典的递归算法问题,源自印度的一个传说,它通过动画演示能更直观地展示算法的运作过程。这个压缩包包含了“汉诺塔动画演示”的资源,包括一个名为“Hanoi.exe”的可执行文件,可能是用来运行汉诺...

    汉诺塔图形解法(递归算法)

    汉诺塔图形解法(递归算法) 汉诺塔图形解法是利用递归算法来解决汉诺...HanNoTa 图形解法是一种使用递归算法来解决汉诺塔问题的经典示例,能够直观地显示汉诺塔的移动过程,帮助用户更好地理解递归算法的思想和实现。

    VC++汉诺塔算法.7z

    总的来说,“VC++汉诺塔算法.7z”中的源码为我们提供了一个使用C++实现的经典递归问题的实例,对于学习C++编程和理解递归思想具有很好的参考价值。通过阅读和运行这段代码,我们可以更深入地理解汉诺塔问题以及如何...

    用栈实现汉诺塔问题

    任意输入N个盘,在三个柱子上实现汉诺塔问题的非递归求解,用栈进行

    四柱汉诺塔_四柱汉诺塔_

    在提供的文件`1559四柱汉诺塔.cpp`中,我们可以预期看到实现四柱汉诺塔算法的C++代码。这个文件可能包含了主函数`main`,用于初始化游戏状态并调用`moveDisks`函数,以及一个递归函数`moveDisks`,它负责按照上述...

    汉诺塔算法分析实验报告

    - **M 根柱子的汉诺塔问题**:当柱子数量M为3时,可以使用经典的汉诺塔算法,即 pow(2,n) - 1 的公式计算最少移动次数。对于M不等于3的情况,使用递归策略,通过计算不同分割点的最少移动次数并找到最小值。 - **...

    汉诺塔_汉诺塔移动步骤与步数_

    汉诺塔问题的解决可以通过一个名为“汉诺塔算法”的递归方法来实现。该算法的核心思想是先将上部的n-1个圆盘借助柱子B从柱子A移动到柱子C,然后将剩余的第n个圆盘直接从柱子A移动到柱子C,最后再借助柱子A将柱子B上...

Global site tag (gtag.js) - Google Analytics