先说汉诺塔游戏:有三根柱子,在其中一根柱子按照上小下大的顺序依次摆放N个圆盘,规定一次一个圆盘,并且小的只能在大的圆盘上面,把柱子上的所有圆盘转移到另一根柱子上。需要多少步数。
1.找规律
从1个圆盘,开始
2个圆盘
3个圆盘
总结:通过3个圆盘的分解可看出:
1)是把前两个圆盘与第三圆盘分开(步骤3)
2)把第三个圆盘移到目标柱子
3)把分开的两个圆盘在依次移动到目标柱子
而在1)中把两个圆盘与第三个分开,相当于两个圆盘移动到目标柱子;3)中把两个圆盘依次移动到目标柱子,亦相当于两个圆盘移动到目标柱子;所以三个圆盘的移动相当于2次两个圆盘的移动加一次:a(3)=a(2)+a(2)+1
类比4个圆盘,规律一致,具体不在分析。
继续归纳:每次都是先将其他圆盘移动到辅助柱子上,并将最底下的圆盘移到c柱子上,然后再把原先的柱子作为辅助柱子,并重复此过程。
则n个圆盘:a(n)=a(n-1)+1+a(n-1)
int hut(int x)
{
if (x > 1)
return 2 * hut(x - 1) + 1;
else
return 1;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = hut(n);
printf("ret=%d\n", ret);
}