我对汉诺塔的理解

最近在复习C++相关的算法,而这之中就有汉诺塔,网上也看了很多信息,代码很简单,但是感觉原理没有讲透。我就想着我来分享我对汉诺塔的看法。

一、汉诺塔问题

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

该问题的百度百度百科链接:点击打开链接

二、代码思路

汉诺塔问题,简单来说就是有A,B,C三个柱子,然后将A中的盘子移动到C中的盘子,但是每次移动的时候必须保证小盘子在大盘子上面。B 作为一个辅助盘子。

首先当只有1个盘子在A上的时候,就移动1次,从A 移动C。

那有两个盘子在A上的时候,肯定先将小盘子移动到B,然后大盘子由A移动到C。小盘子由 B移动到C。

分析两个盘子的情况,两个盘子比1个盘子的情况多了一步,把小盘子移动到B的过程,另外两步的本质都可以看出由A移动到C。

那么当有N个盘子在A上的时候,我们是怎么样来做的?我们的解决办法是否可以理解成有两个盘子的状态。

N个盘子,       A,B,C 三个柱子

第一步,   将n-1个盘子移动到B,即  f(n-1, A,C,B)      这里的意思是 N-1的盘子,通过C为中间,移动到B盘

第二步,    将最底下的大盘子, 由 A移动C move(A,C)

第三步,    此时经过前两步骤,A:0个盘子 ,  B:N-1个盘子, C:1个最大的盘子

那么接下来,就是将B 移动到 C  , 即  f(n-1,B,A,C)    这里的意思是 n-1的盘子,通过A为中间,移动到C盘

关于递归来讲,就两个,第一个,明白循环结束条件, 第二个,循环体。

那么循环结束条件就是,n<1,即没有盘子的情况

#include <iostream>

class han{
public:
    int num;
    han(int a):num(a){}

    void move(char m, char n){
        static int numb = 0;
        numb++;
        std::cout << "第" << numb << "次" << std::endl;
        std::cout << m << "-> " << n << std::endl;
    }
    void pai(int num, char a, char b, char c){
        if (num < 1){
            return;
        }
        else{
            pai(num - 1, a, c, b);
            move(a,c);
            pai(num-1,b,a,c);
        }
    }
    void solve(){
        char A = ‘A‘;
        char B = ‘B‘;
        char C = ‘C‘;
        pai(this->num, A, B, C);

    }
};

int main(){

        int n = 0;
        std::cout << "请输入你想放的盘子:    ";
        std::cin >> n;
        han han1(n);
        han1.solve();
        std::cout << std::endl;

    std::cin.get();
    std::cin.get();
    return 0;
}
时间: 2024-08-02 15:20:12

我对汉诺塔的理解的相关文章

汉诺塔递归算法理解及实现

汉诺塔:(Hanoi)是一种玩具,如图![这里写图片描述] (http://img.blog.csdn.net/20150430225337439) 从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 问题理解与描述: 1.问题的理解与描述 问题的形式化表示为: 输入:圆盘数n,3根细杆-- 源杆A.过渡杆B和目标杆C. 输出:圆盘从源杆移动到目标杆过程的最少步骤序列. 2.算法的伪代码: HANOI(n,

递归小问题之汉诺塔

递归挺重要的,一定要会 对于汉诺塔的理解,其实是很简单的,但是感觉也挺经典的:假设one,two,thr三个支柱,要将第一个支柱上的n个盘子移到第三个上,输出移动的顺序; 1.其实也就是将n-1个盘子借助thr移到two上, 2.然后将one上的第n个盘子移动到thr上: 3.然后将two上的n-1个盘子移到thr上: 而对于n-1个盘子如何来进行移动,则就属于递归调用了. #include<stdio.h> void move(char x,char y); void hano(int n,

汉诺塔算法的理解

当盘子数为两个时,移动图如下: 移动规律为: 步骤 盘子编号 源柱子 目标柱子 1 1 A B 2 2 A C 3 1 B C 当盘子数为3个时: 移动规律为: 步骤 盘子编号 源柱子 目标柱子 1 1 A C 2 2 A B 3 1 C B 4 3 A C 5 1 B A 6 2 B C 7 1 A C 从以上移动移动规律可以总结出,当步骤序号和盘子数目相同时,就是把最底下的盘子从A移动到C,其它的步骤都是对等的,规律如下: 中间以上动作是:源柱子(A)不变,目标柱子为C,辅助柱子为B进行移动

递归理解-汉诺塔问题

汉诺塔问题 汉诺塔问题的求解可以巧妙利用递归思想 以下摘自知乎上我认为阐述得很清除回答: 要用程序来解决这个问题,我们先定义一个移动函数:move(移动数,开始柱,中转柱,目标柱), 例如 move(2,A,B,C) 表示将2个盘子从A柱(开始柱)借助B柱(中转柱)移动到C柱(目标柱). 关于开始柱,中转柱,目标柱这三个概念可以用移动过程中的某个状态来理解, 看下面一张图应该就能明白: 有三种状态的柱子,开始柱,中间柱,目标住,开始柱指的是开始状态时存放所有盘子的柱子,中转柱指的是中间状态时暂时

汉诺塔的递归算法与解析

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法. 至于递归,简单来说

汉诺塔问题(递归与非递归)

汉诺塔比较经典的实现是利用递归,但也可以利用堆栈. 题意理解:有A,B,C三个柱子,将A柱子上的N个盘子(从大到小排列)移到C柱子上,每次只允许移动一个盘子,并且保证每个柱子上的盘子的排列都是从大到小. 1.递归实现 假设只有一个盘子,那么只需实现 A->C 这个动作: 如果有两个盘子,那么需要 (1)A->B; (2)A->C; (3)B->C; 如果有三个盘子,可以将前两个盘子看作一个盘子,对两个盘子重复以上三个步骤,于是得到N个盘子的递归算法,递归结束的条件是N=1: 1 v

CodeVs[3145 汉诺塔游戏]

题目描述 Description 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小

汉诺塔递归解决方法经典分析

一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 虽然这只是一个传说,但也给我们提出了一个问题,

HDU 2064 汉诺塔III(递归)

题目链接 Problem Description 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面.现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面.Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在