一、汉诺塔III(问题链接)
假设a[n]为将n个圆盘从A在满足规则下移至C,则n规模问题可分解为n-1规模问题:
移动次数
1.将n-1个圆盘从A移至C a[n-1]
2.将第n个盘移至B(需满足其经过B放至C) 1
3.将n-1个圆盘从C移至A a[n-1]
4.将第n个盘移至C 1
5.将n-1个圆盘从A移至C,完成移动 a[n-1]
故递推公式为a[n] = 3 * a[n-1] + 2
</pre><pre name="code" class="java">import java.util.Scanner;
public class Main {
static long[] a = new long[36];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int n = in.nextInt();
a[0] = 0;
for(int i = 1; i <= n; i++){
a[i] = 3 * a[i-1] + 2;
}
System.out.println(a[n]);
}
}
}
二、汉诺塔IV(问题链接 )
移动方式同汉诺塔III,将n规模问题分解为n-1规模问题,n规模问题相当于在n-1规模(将n-1个圆盘从A移至C)中插入两次移动(将第n个盘从A->B->C)
故递推公式为a[n] = 3 * a[n-1] + 2,而移动次数为a[n-1]+2
import java.util.Scanner;
public class Main {
static long[] a = new long[21];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
while(m-- > 0){
int n = in.nextInt();
a[0] = 0;
for(int i = 1; i <= n; i++){
a[i] = 3 * a[i-1] + 2;
}
System.out.println(a[n-1]+2);
}
}
}