欢迎使用CSDN-markdown编辑器
Posted yuyaweibest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欢迎使用CSDN-markdown编辑器相关的知识,希望对你有一定的参考价值。
汉诺塔算法
问题来源:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
示例参考图:
简单举例:
1、当n=1时,直接把圆盘放到目的柱子上。
2、当n=2时
3、当n=3时
可以看出f(1)=1,f(2)=3,f(3)=7……f(n)=2*f(n-1)+1 ;
解决思路:
1、把n-1个圆盘从起点盘移动到没有任何圆盘的过渡盘;
2、把最后一个圆盘从起点移动到目标盘;
3、把n-1个圆盘从过渡盘移动到目标盘(参考1和2的操作来实现);
这就变成了递归问题!扩展到n,需要的操作次数为f(n)=2*f(n-1)+1
C++代码实现
其中A为初始盘,C为目标盘,输入需要从A->C的圆盘个数n
#include <iostream>
using namespace std;
void move(char x,char y);
void hannuota(int n,char m,char q, char p);
int sum=0;
int main()
int n;
cout<<"请输入汉诺塔:n"<<endl;
cin>>n;
hannuota(n,'A','B','C');
cout<<"需要移动的次数:"<<sum;
cin.get(); //为了在输出窗口看到最终结果,所以调用了两次cin.get()
cin.get();
return 0;
void move(char x,char y)
sum++;
cout<<x<<"->"<<y<<endl; //在窗口显示移动的过程:x->y
void hannuota(int n, char m,char q,char p)
if(n==1)
move(m,p); //递归结束条件,将最后一个盘从m移动到目标盘p
else
hannuota(n-1,m,p,q); // 把n-1个圆环从起点盘m移动到(当前)没有任何圆环的过渡盘q
move(m,p); // 把最大的圆盘从起点起点盘m移动到目标盘p
hannuota(n-1,q,m,p); // 把n-1个圆环从过渡盘q移动到目标盘p
测试
输入n=4:
输出:
其他测试类似,均能输出正确结果,实验成功!
以上是关于欢迎使用CSDN-markdown编辑器的主要内容,如果未能解决你的问题,请参考以下文章