首页 > 代码库 > 九连环解法( 基于递归 )
九连环解法( 基于递归 )
前不久拿到一套九连环,在解开过程中发现就是一个不断递归的过程,而经过抽象后,发现九连环可以理解成简化的横置版汉诺塔。递归的计算,计算机可是比人快多了,那么计算机怎么实现?
这段小代码不仅限于九连环,所以自称类九连环。代码如下。
#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 << "\n" << 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 << "\n" << 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,\n手柄手持端最近圆环为最大编号。" << endl ; cout << "下面展示类九连环游戏" << num << "个圆环时的解法步骤:" << endl ; LoopDown ( num ) ; cout << "\n共" << count << "步。" << endl ; cout << " 退出请输入0。任意数字重新开始。 " << endl ; num = 0 ; cin >> num ; if ( !num ) break; }}
程序运行图:
以上百行代码,自娱自乐。又要周末了,消遣一下。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。