Hanoi汉诺双塔问题
题目描述
给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
输入数据
输入为一个正整数 n ,表示在 A 柱上放有 2n 个圆盘。
输出数据
输出文件hanoi.out仅一行,包含一个正整数,为完成上述任务所需的最少移动次数 An 。
样例输入
Sample 1:
1
Sample 2:
2
样例输出
Sample 1:
2
Sample 2:
6
样例说明
对于50%的数据, 1< =n< =25
对于100% 数据, 1< =n< =200
提示:设法建立An与An-1的递推关系式。
- 原始的汉诺塔问题:汉诺塔大家应该都知道,也应该都直到汉诺塔的递推公式是什么。怎样简单的理解呢?不用太多的推算,建议大家这样理解:对于n个盘子来说,前n-1个圆盘全部移走之前,第n个圆盘肯定是一直在初始的杆子的最下面。而且又因为第n个是最大的,它不能放到任何盘子上方,所以在移动前n-1个圆盘的时候,最大的那个可以忽略。然后,把n-1个圆盘移到第二根杆子上之后(这时已经移动了f(n-1)次),是不是只有最大的那个还在原来的杆子上?这时,把最大的那个圆盘移到第三根杆子上,这又移动了一次,然后干什么呢?把那n-1个圆盘移到第三根杆子上!又是f(n-1)次!所以f(n)=2*f(n-1)+1!
- 汉诺双塔:看懂上一段的,应该已经领会到汉诺n塔的精髓了。无非就是先把n-1组圆盘移到第二根杆子上,然后把第n组圆盘移到第三根杆子上,然后再把n-1组圆盘移到第三根杆子上,一共移动了f(n)=2*f(n-1)+n次。
- 坑爹之处:你以为这就完了?你可太天真了(因为我就是这么天真,哼)!这题里面可能出现的数高达200,到那会儿早就超过了unsigned long long的范围。所以如果用C++的话就要用高精度。具体就是用数组来保存数字的每一位,然后人为的实现加法和进位,最后输出数组就可以了。
然而数据太大这种问题怎么能让我们人类考虑呢?然后我就选择了Python…
Python不用考虑这个问题!多大的数都可以!哈哈哈!
这是Python代码,是不是很简洁……
def hanoi(n):
if n == 1:
return 2
else:
f = 2 * hanoi(n - 1) + 2
return f
a = int(input())
print(hanoi(a))