版权声明:感谢阅读,欢迎批评指正。 https://blog.csdn.net/skyejy/article/details/89814360
改变汉诺塔问题的一个条件:不允许从第一个柱子直接移动到第三个柱子上,也不允许直从第三个柱子直接移动到第一个柱子上。即:每次移动一定是移到中间杆或者从中间杆移出去。
此时的解题思路是:
考虑K个圆盘的移动情况。设将K个盘子从第一根柱子移动到第三根柱子共需要次移动。
为了首先将初始时最底部最大的圆盘移动到第三根柱子上,首先需要将其上的K-1个圆盘移动到第三根柱子上(移动次)。这等价于移动K-1个圆盘从第一根柱子到第三根柱子。当这一移动完成时:第一根柱子上仅剩一个最大的圆盘,第二根柱子为空,第三根柱子按顺序摆放着K-1个圆盘。
为了让最大的圆盘从第一根柱子移动到第三根柱子上,需要先将最大圆盘移动到柱子二上(移动1次);再将K-1个圆盘从第三根柱子移动到第一根柱子(移动次),移动次数等价于K-1个盘从柱子一移动到柱子三。
完成上述步骤后,将最大圆盘从柱子二移动到柱子三(移动1次)。最后将k-1个盘子移回第三根柱子(移动次)
综上:
递归出口:x=1时,从第一根柱子到第三根柱子,需要2次(因为题目要求“不允许从第一个柱子直接移动到第三个柱子上,也不允许直从第三个柱子直接移动到第一个柱子上。即:每次移动一定是移到中间杆或者从中间杆移出去。”)
#include<stdio.h>
#include<string.h>
long long F(int num)//返回值较大时使用long long类型
{
if(num==1) return 2;
else
return 3*F(num-1)+2;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
printf("%lld\n",F(n));
}
}