uva 10254(四柱汉诺塔)

来源:互联网 发布:博拉网络上市最新消息 编辑:程序博客网 时间:2024/05/01 01:51

题意:给出四柱汉诺塔上初始柱子上圆盘的数量n,问最优多少次移动可以移动到另一个柱子上。
题解:可以参考四柱汉诺塔之初步探究和四柱汉诺塔实现这两篇论文,理解四柱汉诺塔的原理。
但是这道题n是从1到10000,递归太多层,而且需要用到大数,所以要找规律,f[i] = f[i - 1] + 2^k,k从1开始每k+1次计算f[i]后增大1,初始f[1] = 1。

import java.math.BigInteger;import java.util.*;public class Main {    public static void main(String[] arge) {        BigInteger[] f = new BigInteger[10005];        BigInteger One = BigInteger.ONE;        BigInteger Zero = BigInteger.ZERO;        f[0] = Zero;        f[1] = One;        int i = 2, k = 1;        while (i <= 10000) {            BigInteger Add =  BigInteger.valueOf(1).shiftLeft(k); //1 << k            for (int j = 0; j < k + 1 && i <= 10000; j++, i++)                f[i] = f[i - 1].add(Add);            k++;        }        Scanner cin = new Scanner(System.in);        while (cin.hasNext()) {            int n = cin.nextInt();            System.out.println(f[n]);        }    }
0 0