汉诺一双塔问题

问题 A: Hanoi双塔问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 166  解决: 54
[提交][状态][讨论版]

题目描述


给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有空的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。现要将 这些国盘移到C柱上,在移动过程中可放在B柱上暂存。要求:



(1)每次只能移动一个圆盘;

(2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序;

任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。

输入


输入文件hanoi.in为一个正整数n,表示在A柱上放有2n个圆盘。

输出


输出文件hanoi.out仅一行,包含一个正整数,为完成上述任务所需的最少移动次数An。

样例输入

1 

样例输出

2 

提示



对于50%的数据,1<=n<=25

对于100%数据,1<=n<=200

设法建立An与An-1的递推关系式。

我的代码是这样的:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long n;
    cin>>n;
    cout<<2*(pow(2,n)-1)<<endl;
    return 0;
}
显示答案错误50%,大家能帮我看看吗😁

#笔试题目##C/C++##春招#
全部评论
汉诺塔问题跟树的LDR遍历一个道理 1.对于单个情形,也就是最大的圆盘的情形,直接从A移动到C,因此直接打印移动的方法即可,并且返回 2.对于两个圆盘的情形,分为三步进行: (1)从A移动到B一个 (2)从A移动到C一个 (3)将B中暂存的移动到C 因此跟BST的递归LDR遍历非常像,此时我们的调用打印应该为三步: (1)打印A-B (2)打印A-C (3)打印B-C 因此我的递归为: hanoi(n-1,A,C,B); printf当前A-C; hanoi(n-1,B,A,C); void hanoi(int n,char A,char B,char C){ if(n<=1){ printf("1 move %c to %c\n",A,C); return; } hanoi(n-1,A,C,B); printf("%d move %c to %c\n",n,A,C); hanoi(n-1,B,A,C); } 这样可以输出每一次的移动情况,如果只需要次数,不输出,累加个数即可
点赞 回复
分享
发布于 2019-06-11 12:54

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务