前不久拿到一套九连环,在解开过程中发现就是一个不断递归的过程,而经过抽象后,发现九连环可以理解成简化的横置版汉诺塔。递归的计算,计算机可是比人快多了,那么计算机怎么实现?
这段小代码不仅限于九连环,所以自称类九连环。代码如下。
#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; } }
程序运行图:
以上百行代码,自娱自乐。又要周末了,消遣一下。