汉诺塔问题
问题描述:
(时间限制: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柱,注意的是,这里的a,b,c三个基座,并不代表A,B,C这三个基座,a指的是每一次移动的起始基座,b指的是目的基座,而c指的是辅助基座
函数递归多少次,只需要在递归的函数里写入一个变量,每调用依次,就加1
程序的出口就在n==1时出口一次
代码如下:
#include<iostream>
using namespace std;
int s = 0,k;
void hanoi(int n, char a, char b, char c)
{
if (n >