美文网首页
算法分析与设计C++汉诺塔实现

算法分析与设计C++汉诺塔实现

作者: 余生如意 | 来源:发表于2019-10-13 18:44 被阅读0次

    递归算法三:汉诺塔
    问题描述


    file

    移动规则:
    每次只能移动一个圆盘;
    圆盘可以插在A、 B和C中的任何一个塔座上;
    任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

    分析
    边界条件
    只有一个圆环时,只需将圆环从第一座塔移到第三座塔
    递归条件
    1、从第一座塔把n-1个圆环移到第二座塔,用第三座塔做辅助
    2、从第一座塔把第n个圆环移到第三座塔
    3、从第二座塔把n-1个圆环移到第三座塔,用第一座塔做辅助

    代码

    简单汉诺塔递归实现

    #include<iostream>
    using namespace std;
    void move(char from, char to){
        cout<<"Move"<<from<<"to"<<to<<endl;
    }
    void hanoi(int n, char first, char second, char third){
        if(n==1){
            move(first, third);
        }else{
            hanoi(n-1, first, third, second);
            move(first, third);
            hanoi(n-1, second, first, third);
        }
    }
    int main(){
    
        int m;
        cout<<"the number of diskes:";
        cin>>m;
        cout<<"move "<<m<<" diskes:\n";
        hanoi(m,'A','B','C');
        return 0;
    }
    

    汉诺塔递推实现

    #include<iostream>
    using namespace std;
    int main(){
        int m;
        cin>>m;
        long long p = 0;
        for(int i=0; i<m; i++){
            p=2*p+1;
        }
        cout<<2*p<<endl;
        return 0;
    }
    

    递推和递归都可以实现汉诺塔 但无法完美通过openjudge上的问题,可能是因为当数据很大时,数据溢出,可能需要通过自己编写大整数运算的算法来解决问题。这个下一篇文章单独写出。

    相关文章

      网友评论

          本文标题:算法分析与设计C++汉诺塔实现

          本文链接:https://www.haomeiwen.com/subject/eqnmuctx.html