NEUQ 1419: Hanoi双塔问题
2015-08-14 21:27
337 查看
1419: Hanoi双塔问题
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给定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的递推关系式。
来源
NOIP2007分析:我忽然发现汉罗塔的移动步骤次数满足公式2^n-1,而汉罗双塔满足2^(n+1)-2,所以这题需要用到大数。
CODE:(开始没看到数据范围,写了个DFS)
#include <iostream> using namespace std; int ans; void DFS(int n){ if(n==1){ ans++; return ; } DFS(n-1); ans++; DFS(n-1); return ; } int main() { int n; while(cin>>n){ ans=0; DFS(n+1); cout<<ans-1<<endl; } return 0; }
CODE:
import java.util.*; import java.math.*; import java.io.*; public class Main{ public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n=cin.nextInt(); BigInteger m=BigInteger.valueOf(2); BigInteger ans=m.pow(n+1); ans=ans.subtract(m); System.out.println(ans); } }
相关文章推荐
- parted 与 fdisk 分区方式
- AxureRP——动态面板
- STM32学习笔记——系统定时器SysTick
- C# DataSet 的使用
- hdu 5389 Zero Escape dp
- C++对象模型——对象复制语意学 (Object Copy Semantics)(第五章)
- 一步操作配置Word环境
- smartctl的使用
- hdu3306
- 总结python对csv文件的操作
- JUnit4测试框架
- 将博客搬至CSDN
- hdu5384 AC自动机模板题,统计模式串在给定串中出现的个数
- 翻转单词+左旋字符串
- 编程实现全排列
- spring自定义标签
- 时隔一周继续学习
- 支持RecyclerView的CursorAdapter的RecyclerViewCursorAdapter
- HDU1285确定比赛名次【拓扑排序】
- CentOS 7 编译64位Hadoop2.7.1