1 #include <iostream> 2 using namespace std; 3 //第一个塔为初始塔,第二个塔为中转塔,第三个塔为目标塔 4 5 int i = 1; //记录步数 6 void move(int n,char from,char to) //将编号为N的盘子由from塔转移到to塔 7 { 8 cout<<"第"<<i++<<"步:将"<<n<<"号盘子"<<from<<"---->"<<to<<endl; //输出实例:第1步:将1号盘子A---->C 9 } 10 11 void hanoi(int n,char from,char denpend_on,char to) //汉诺塔递归函数,参数依次为盘子数,起始塔,中转塔,目标塔 12 { 13 if(n==1) 14 { 15 move(1,from,to); //当需要移动的盘子数为1的时候,将此盘子从起始塔直接移动到目标塔 16 } 17 else 18 { 19 hanoi(n-1,from,to,denpend_on); //当需要移动的盘子数不为1的时候, 20 //先将除最下面的盘子外的盘子从起始塔借助目标塔移动到中转塔 21 move(n,from,to); //将剩下的最后的塔直接从起始塔移动到目标塔 22 hanoi(n-1,denpend_on,from,to); //将之前移走的n-1个盘子从中转塔借助起始塔移动至目标塔 23 } 24 } 25 26 int main() 27 { 28 int n = 0;//n为盘子数 29 cout<<"请输入盘子的个数:"; 30 cin>>n; 31 while(n<=0)//非法盘子数判断 32 { 33 cout<<"盘子的个数不应小于1,请重新输入:"; 34 cin>>n; 35 } 36 if(n>0) 37 { 38 char x=‘A‘,y=‘B‘,z=‘C‘; 39 cout<<"盘子移动情况如下:"<<endl; 40 hanoi(n,x,y,z); //调用hanoi函数 41 return 0; 42 } 43 }
运行结果:
递归实现,未对过程进行存储。
未用堆栈进行盘子位置的存储,仅展示结果。
理解递归为主吧,就像包子馅的包子(极限是馒头)。
侵删。
原C代码出处:http://blog.csdn.net/kkkkkxiaofei/article/details/8333644/
时间: 2024-11-08 19:23:53