0
点赞
收藏
分享

微信扫一扫

uva 10254(四柱汉诺塔)


题意:给出四柱汉诺塔上初始柱子上圆盘的数量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 条评论