(Java实现)HDOJ 2064 汉诺塔III && 2077 汉诺塔IV

(Java实现)HDOJ 2064 汉诺塔III && 2077 汉诺塔IV_第1张图片

一、汉诺塔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);

		}

	}

}



你可能感兴趣的:(java,HDU,汉诺塔)