Hanoi双塔问题
题目
给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有空的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。现要将 这些国盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
输入描述
Input
输入文件hanoi.in为一个正整数n,表示在A柱上放有2n个圆盘。
输出描述
Output
输出文件hanoi.out仅一行,包含一个正整数,为完成上述任务所需的最少移动次数An。
样本输入
Input example
1
样本输出
Output example
2
解答
import java.math.BigInteger;
import java.util.Scanner;
/*
* 分析可知,在单汉诺塔的情况下,每加一个盘,次数就在原有基础上 *2+1 。推论得N个最少需要移动 2的N次方-1 次。而双诺塔则在单诺塔基础上乘以二即可
* 解法一:由公式直接java大数据运算
* 解法二:二进制数每加一位1也是在原有的数值上 *2+1。因为N个盘(单诺塔)最少移动次数 = N位都为1的二进制数。而双诺塔 *2 ,即N+1位都为1的二进制数-1
*/
public class Main{
public static void main(String[] args){
//解法一:Java大数据运算
// Scanner in =new Scanner(System.in);
// int n = in.nextInt();
// BigInteger big = new BigInteger("2");
// big = big.pow(n+1);
// big = big.subtract(BigInteger.ONE);
// big = big.subtract(BigInteger.ONE);
// System.out.println(big.toString());
//解法二:二进制运算
StringBuffer str = new StringBuffer();
Scanner in = new Scanner(System.in);
int n =in.nextInt();
for(int i=0;i<=n;i++) {
str.append("1");
}
BigInteger big = new BigInteger(str.toString(), 2);
big=big.subtract(BigInteger.ONE);
System.out.println(big.toString());
}
}