约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。 现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。 Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有N个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边? |
包含多组数据,每次输入一个N值(1<=N<=35)。 |
对于每组数据,输出移动最小的次数。 |
1 3 12 |
2 26 531440 |
问题分析
递推题 |
汉诺塔是我很喜欢玩的一个游戏。 如果规则没这么变态,允许直接从1跨越到3,那n个盘最少需要2n - 1次。 这个公式可以递推得到,很容易的,你可以试一下,这里就不阐述了。 而这一题同样可以用递推得到。我们先来看看下面一组图,了解一下如何把n个盘从1搬到3。
我们设f(n)为把n个盘从1移到3所需要的步数,当然也等于从3移到1的步数。
|
典型递归题。看了源码。发现真的可以好简单。
2077 汉诺塔IV
还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。 |
输入数据的第一行是一个数据T,表示有T组数据。 每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。 |
对于每组输入数据,最少需要的摆放次数。 |
2 1 10 |
2 19684 |
递推题 |
既然最大的那个盘可以放在最上面,那就不用想汉诺塔III一样吧前n-1个盘全从1搬到3了。 只要从1搬到2,然后把第n个盘从1搬到2再搬到3,然后把这n-1个从2搬到3。 所以,问题转换成n个盘搬一步需要几次。但前n-1个盘和汉诺塔III的的规则是一样的。 所以,需要先把前n-2从1搬到3,然后把第n-1个盘从1搬到2,再把前n-2个盘从3搬到2。就完成了! 以为把n个盘按汉诺塔从1搬到3需要3n - 1(推导见2064)。 所以把n-1个盘移动1步,需要f(n) = f(n-1) + 3n-1 而f(1) = 1 所以f(n) = 3n-1 + 3n-2 + ... + 3 + 1 = (3n - 1) / 2 所以按汉诺塔IV的规则来,搬n个盘需要m(n) = 2 * f(n-1) + 2 = 3n-1 + 1 |
(其中f(n)=f(n-1)+3n-1的原因是先把n-1个盘从1移到3(第二项),再把n-1个盘移动一步(第一项),根据等比数列求和公式,求得f(n),再由2064的推导法获得m(n))