题目描述:

约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有N个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?

输入:

包含多组数据,每次输入一个N值(1<=N=35)。

输出:

对于每组数据,输出移动最小的次数。

样例输入:
1
3
12
样例输出:
2
26
531440
 ------------------------------------------
  题中改变了原有的汉诺塔规则,而是 每次必须经过中间的柱子,尽管有些许变化但是推到过程是一样的(现设有A,B,C三个柱子,以及标号为1-N的盘子),既然不能将编号为N的盘子移动到C上,那么就必须先移动N到B上,这样的话就先有N- 1个盘子在C上这个状态,然后在移动N到C上之前又要把N-1个盘子移动到A上,要达到最终目的的话,就要再把N-1个盘子移动到C上。
  上述过程就得到一个递推式 F[N]= 3* F[N-1]+ 2, 得到F[N]= 3^ N- 1。
 
import java.util.Scanner;
 public class Main {    
     public static void main(String[] args) {
         Scanner sc=new Scanner(System.in);
         int N;
        while(sc.hasNext()){
            System.out.println(F(sc.nextInt()));
        }
       
     
static long F(int n){
    if(n==1)return 2;
    else return 3*F(n-1)+2;
}   
 }

最新文章

  1. BVT &amp; BAT (版本验证测试和版本验收测试)
  2. MySql的一些操作
  3. php+curl上传文件
  4. python数字图像处理(3):图像像素的访问与裁剪
  5. SDUT 2623:The number of steps
  6. opennebula 自定义安装目录
  7. No bean named &#39;transactionManager&#39; is defined
  8. linux 常识笔记 20160621
  9. range() 函数创建并返回一个包含指定范围的元素的数组
  10. .net快速创建PDF文档 by c#
  11. Flask学习记录之Flask-Migrate
  12. windows下开发PHP扩展(无需Cygwin)
  13. 【深入Java虚拟机】之七:Javac编译与JIT编译
  14. Maven-05:插件目标
  15. 深度学习 Fine-tune 技巧总结
  16. javascript语法之with语句
  17. zeros()和ones()和eye()
  18. Go cookie
  19. Embedded SW uses STL or not
  20. dubbo实现原理之动态编译

热门文章

  1. html embed用法
  2. jquery html 动态添加元素绑定事件
  3. DIV+CSS外部字体引用
  4. python之正则表达式备忘
  5. launchpad bzr
  6. C# 当double数值较大且小数位过多时转化成字符串并保留小数位
  7. ACM训练计划step 1 [非原创]
  8. Android 安装过程中的问题
  9. 禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)
  10. Alignment ( 最长上升(下降)子序列 )