汉诺塔问题
问题描述:
(时间限制:3000MS 内存限制:32768KB)
汉诺塔问题是指:有三根柱子A、B、C,A柱上有n个大小不等的圆盘,大盘在下,小盘在上。要求将所有圆盘从A柱搬到C柱上,每次只能搬动一个盘子,搬动过程中可以借助任何一根柱子,但必须满足大盘在下,小盘在上。如何搬运盘子呢?
可以说,解决汉诺塔问题最好的算法就是递归,教材上也给出了打印搬运步骤的示例程序。可是,小马同学是个喜欢刨根问底的同学,她想知道,到底递归函数总共调用了多少次?递归程序出口的语句是否只执行1次?
输入
输入只有一组数据,在一行上输入圆盘的个数 n(保证满足n<=64)。
输出
在一行上输出两个整数,首先输出总共调用递归函数的次数,在空格后输出作为递归程序出口的语句的执行次数。
难度
较难
输入示例
2
输出示例
3 2
算法分析:
汉诺塔时典型的递归问题,愿意的将64个盘按照程序的方法挪动,估计人类都灭绝了,这里只是提供一种递归的思想,只考虑递归的结果,而并不去考虑递归的过程,只需要分三步。
第一步:将n-1个圆盘从A柱搬到C柱,借助于B柱
第二步:将第n个圆盘从A柱搬到B柱
第三步:将n-1个圆盘从C柱搬到B柱,借助于A柱
设置递归函数Hanoi(n,a,b,c),参数分别代表盘数,a,b,c柱ÿ