//汉诺塔的算法实现 //另外有汉诺塔操作的演示DEMO,因为空间关系,请邮件索取。
//完成日期:2005-03-15
#include<iostream>
using namespace std;
void move(unsigned n,char from,char to,char use);//汉诺塔的递归函数
int counter(0);//记录执行步数的全局变量
int main()
{
unsigned n;//n为问题的规模,同时也是不同圆盘的标记符
cout<<"请输入汉诺塔中圆盘的数目:"<<std::flush;
cin>>n;
cout<<"解法过程为:"<<endl;
move(n,'A','C','B');//将n个圆盘从A柱移到C柱
cout<<"==========================================================="<<endl;
cout<<"解决规模为"<<n<<"的汉诺塔问题一共用了"<<counter<<"步。"<<endl;
cin.get();
return 0;
}
void move(unsigned n,char from,char to,char use)//汉诺塔的递归函数
//用use为中间柱子,将n个圆盘从柱子from搬到柱子to上。
{
unsigned i;
if(n>0)
{
++counter;
////////////////////////////////////
//以下为显示代码
cout<<"第"<<counter<<"步:"<<endl;
for(i=0;i<n;++i)cout<<" ";
cout<<"为了将第"<<n<<"个盘子从"
<<from<<"般到"<<to<<",我们使用"<<use<<endl;
if(n>1)
{
for(i=0;i<n;++i)cout<<" ";
cout<<"然后,将第"<<n-1<<"个盘子从"
<<from<<"般到"<<use<<",我们使用"<<to<<endl;
for(i=0;i<n;++i)cout<<" ";
cout<<"最后,将第"<<n-1<<"个盘子从"<<use<<"般到"<<to<<",我们 使用"<<from<<endl;
}
//显示代码结束
///////////////////////////////////
move(n-1,from,use,to);
if(n>1)
move(n-1,use,to,from);
}
else
{
cout<<"该次递归调用结束"<<endl;
return;
}
}
//屏幕显示的格式实在有一点寒酸,有哪位可以帮我做做,也让大家开开眼界吧。
//谢谢了!
评论