简单汉诺塔
在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由n个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
- 1个盘子:将盘子从最左边移动到最右边,只需1步,即a[1]=1
- 2个盘子:将小盘子从最左边移动到中间,再将大盘子从最左边移动到最右边,最后将小盘子从中间移动到最右边,如下图1~3所示,共需3步,即a[2]=3
- 3个盘子就可以寻找到规律了,如图所示,共需7步,即a[3]=7
综上所述,在三根柱子,n个盘子的情况下
最少移动的步数为a[n] = 2 * a[n-1] + 1
变形一
同样是3根柱子,n个盘子,除了要求大盘子不能在小盘子上之外,还要求不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出)
- 1个盘子:从a到b,再从b到c,共需两步,即a[1]=2
- 2个盘子:共需8步,即a[2]=8
- 3个盘子按照同样的原理寻找规律,共需26步,即a[3]=26
综上所述,当添加不能从最左边直接移到最右边的要求后
最小的移动步数为a[n] = 3 * a[n-1] + 2
变形二
在变形一的基础上,允许最大的盘子可以在小盘子上面
即:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),但是允许最大的盘子放到最上面(只允许最大的放在最上面)
- 首先考虑最后的状态,n-1的盘子在中间
- 图片演示得很清楚,接下来要研究a[n]要如何得到
- a[n]的定义是n个盘子移动到邻柱需要的步骤
综上所述可以得到,要研究n个盘子如何到达最右边,就需要知道n-1个盘子到达邻柱所需的步骤,而其是由n-2个盘子到达邻柱所需步骤得出的,它们的关系为:
n个盘子移到最右边的步骤=2*a[n-1]+2
a[n-1] = 3 * a[n-2] + 1
首先得到a[]的表,再根据n直接输出即可