问题:
有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,
要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小
盘子上方,请问至少需要多少次移动?
这是一个典型的汉若塔问题
首先基本上可以分成三个步骤
(1) 先将A上面的n-1个盘子,移到B柱上
(2) 然后把A上最大的一个盘子放到C上去
(3) 然后把B上面的n-1个盘子移到A上去
因为先前看过着这问题,重新看的时候一开始也没有想起来,于是在纸上面画了一下大概的路径
1-1 2-3 3-6
然后发现上面的三个步骤 PS 1 和 3 步骤的次数都是相同的 得出2F(N-1)+1的递归调用
于是对于C++来说可以得出这样的程序
#include<iostream>
using namespace std;
int HanNo(int i)
{
if(i==1){return 1;}
if(i>1){return HanNo(i-1)*2+1;}
}
int main()
{
int count;
cin>>count;
cout<<endl;
cout<<"需要移动的次数为"<<HanNo(count)<<endl;
return 1;
}
今天开始一天一练为了我的编程之旅