• 九连环解法( 基于递归 )


    前不久拿到一套九连环,在解开过程中发现就是一个不断递归的过程,而经过抽象后,发现九连环可以理解成简化的横置版汉诺塔。递归的计算,计算机可是比人快多了,那么计算机怎么实现?

    这段小代码不仅限于九连环,所以自称类九连环。代码如下。

    #include <iostream>
    using namespace std;
    void LoopDown ( int num ) ;
    void CircleDown ( int num ) ;
    void LoopUp ( int num ) ;
    void CircleUp ( int num ) ;
    int count = 0 ;
    /*****前num个环退下*****/
    void LoopDown ( int num )
    {
        if ( num == 2 ) 
        {
            CircleDown ( 2 );
            CircleDown ( 1 ) ;
            return ;
        }
        if ( num == 1 ) 
        {
            CircleDown ( 1 ) ;
            return ;
        }
        LoopDown ( num - 2 ) ;
        CircleDown ( num ) ;
        LoopUp ( num - 2 ) ;
        LoopDown ( num - 1 ) ;
    }
    /*****第num个环退下*****/
    void CircleDown ( int num )
    {
        cout << num << "" ;
        count ++ ;
        if ( ! ( count % 15 ) ) cout << "
    " << endl;
    }
    /*****前num个环装上*****/
    void LoopUp ( int num )
    {
        if ( num == 2 ) 
        {
            CircleUp ( 1 ) ;
            CircleUp ( 2 ) ;
            return ;
        }
        if ( num == 1 ) 
        {
            CircleUp ( 1 ) ;
            return ;
        }
        LoopUp ( num - 1 ) ;
        LoopDown ( num - 2 ) ;
        CircleUp ( num ) ;
        LoopUp ( num - 2 ) ;
    }
    /*****第num个环装上*****/
    void CircleUp ( int num ) 
    {
        cout << num << "" ;
        count ++ ;
        if ( ! ( count % 15 ) ) cout << "
    " << endl;
    }
    void main () 
    {
        cout << "这是类九连环游戏解法简单演示程序" << endl ;
        while ( 1 ) 
        {
            cout << "请输入游戏中圆环的个数:" << endl ;
            float num ;//防止用户输入非整数,加强程序健壮性。
            while ( 1 ) 
            {
                cin >> num ;
                num = num / 1 ;//将输入数据改为整型。
                if ( num > 0 ) break ;
                cout << "输入数据有误,圆环数必须是大于零的整数!" << endl ;
            }
         count = 0 ; cout
    << "本解法将圆环编号,有手柄末端起始编号为1, 手柄手持端最近圆环为最大编号。" << endl ; cout << "下面展示类九连环游戏" << num << "个圆环时的解法步骤:" << endl ; LoopDown ( num ) ; cout << "" << count << "步。" << endl ; cout << " 退出请输入0。任意数字重新开始。 " << endl ; num = 0 ; cin >> num ; if ( !num ) break; } }

    程序运行图:

    以上百行代码,自娱自乐。又要周末了,消遣一下。

  • 相关阅读:
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
  • 原文地址:https://www.cnblogs.com/suanec/p/3912161.html
Copyright © 2020-2023  润新知