Hanoi双塔问题

题目描述:

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

Hanoi双塔问题_第1张图片

 

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

(2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序;任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。

 

输入:一个正整数n,表示在A柱上放有2n个圆盘。

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

样例输入:

1

样例输出:

2

 

提示:对于50%的数据, 1<=n<=25;对于100% 数据, 1<=n<=200

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

 

 

解题思路:

上学期C语言Hanoi单塔给出一个公式2^n-1,双塔就是可以在单塔的基础上*2,所以双塔的公式是2*(2^n-1)=2^(n+1)-2。首先得有怎样移动盘子的思维:有整数n,有2n个盘子在A上,将上面的n-1层共2n-2个盘子借助C,移动到B上;把A柱上第n层的两个盘子移动到C柱上,所需的次数为2,再将B柱上的n-1层共2n-2个盘子,借A柱移动到C上。

import java.util.*;       //前三行是头文件

import java.math.*;

import java.io.*;

public class main{

public static void main(String[] args) {

Scanner cin=new Scanner(System.in); //创建Scanner 语句输入样列

int n=cin.nextInt();

BigInteger m=BigInteger.valueOf(2);      //BigInteger.valueOf()这个是给m附初值。m=2;

BigInteger ans=m.pow(n+1);     //和c语言一样,m的n+1次方。即2的n+1次方。将得到的值付给ans

ans=ans.subtract(m);          //ans.subtract()这个是减的意思。即2的n+1次方-2

System.out.println(ans);                   //输出值

   }

}

//不直接用公式做,而用BigInteger的原因:如果输入一个100,那么得到的值会很大,用int和double型都装不下。如果是c语言做,///它会把得到的值存到一个数组里,所以会很麻烦。但这个BigInteger就可以装下很长的数,原因Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。这两个类本就是java为我们做好的API。

 

 

 

 

你可能感兴趣的:(Hanoi双塔问题)