题意:汉诺塔题目的变形,有4根柱子,可以把顶部的k个盘子移到最后的柱子上,然后按照汉诺塔,问最后走的最小步数。
思路:递推,经过递推可以发现f[n] = f[k]*2+g[n-k],其中f[n]为4个柱子时的最小步数,g[n]为3根柱子的最小步数。要用java大数来解决。
code:
import java.math.*;
import java.util.Scanner;
public class Main {
public static void main(String args[]){
BigInteger f[] = new BigInteger[10010];
f[0] = BigInteger.valueOf(0);
f[1] = BigInteger.valueOf(1);
int i = 2;
int k=1;
while(i <= 10000){
BigInteger add = BigInteger.valueOf(1).shiftLeft(k);
for(int j=0; j<k+1 && i<=10000; ++j){
f[i] = f[i-1].add(add);
++i;
}
++k;
}
Scanner cin = new Scanner(System.in);
while(cin.hasNext()){
int n = cin.nextInt();
System.out.println(f[n]);
}
}
}

本文探讨了一种汉诺塔问题的变形——四柱汉诺塔问题,并提供了一个通过递推公式求解该问题最小步骤数的方法。利用Java的大数处理能力解决了传统整型无法表示巨大数值的问题。
655

被折叠的 条评论
为什么被折叠?



