改编版汉诺塔问题(递归)

版权声明:感谢阅读,欢迎批评指正。 https://blog.csdn.net/skyejy/article/details/89814360

改变汉诺塔问题的一个条件:不允许从第一个柱子直接移动到第三个柱子上,也不允许直从第三个柱子直接移动到第一个柱子上。即:每次移动一定是移到中间杆或者从中间杆移出去。

此时的解题思路是:

考虑K个圆盘的移动情况。设将K个盘子从第一根柱子移动到第三根柱子共需要f(k)次移动

为了首先将初始时最底部最大的圆盘移动到第三根柱子上,首先需要将其上的K-1个圆盘移动到第三根柱子上(移动f(k-1))。这等价于移动K-1个圆盘从第一根柱子到第三根柱子。当这一移动完成时:第一根柱子上仅剩一个最大的圆盘,第二根柱子为空,第三根柱子按顺序摆放着K-1个圆盘。

为了让最大的圆盘从第一根柱子移动到第三根柱子上,需要先将最大圆盘移动到柱子二上(移动1次);再将K-1个圆盘从第三根柱子移动到第一根柱子(移动f(k-1)),移动次数等价于K-1个盘从柱子一移动到柱子三。

完成上述步骤后,将最大圆盘从柱子二移动到柱子三(移动1次)。最后将k-1个盘子移回第三根柱子(移动f(k-1)

综上:f(k)=3\times f(k-1)+2

递归出口: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));
	}
}

猜你喜欢

转载自blog.csdn.net/skyejy/article/details/89814360