汉诺塔问题
Java解决汉诺塔问题
1 package com.java; 2 3 /** 4 * 分治算法 5 * 基本思路: 6 * 对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题, 7 * 这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。 8 * 具体步骤如下: 9 * 1、分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; 10 * 2、解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题; 11 * 3、合并:将各个子问题的解合并为原问题的解。 12 */ 13 14 /** 15 * hanoi问题的基本思路: 16 * 设n为圆盘数,A、B、C为三根石柱, 17 * 1、当n=1时,直接将一个圆盘从A石柱移动到C石柱 18 * 2、当n>1时,将前n-1个圆盘从石柱A,借助石柱C移动到石柱B; 19 * 然后将第n号圆盘从石柱A移动到石柱C; 20 * 最后将前n-1个圆盘从石柱B,借助石柱A移动到石柱C 21 */ 22 23 public class Hanoi { 24 public static void main(String[] args) { 25 26 solve(3); 27 28 } 29 30 public static void solve(int n) { 31 // 已知条件n个圆盘和A、B、C三根石柱 32 hanoi(n, "A", "B", "C"); 33 } 34 35 private static void hanoi(int n, String a, String b, String c) { 36 if (n == 1) { 37 // 只有一个圆盘时直接从A石柱移动到C石柱 38 move(n, a, c); 39 } else { 40 // 将前n-1个圆盘从石柱A移动到石柱B 41 hanoi(n - 1, a, c, b); 42 // 将第n号圆盘从石柱A移动到石柱C 43 move(n, a, c); 44 // 将前n-1个圆盘从石柱B移动到石柱C 45 hanoi(n - 1, b, a, c); 46 } 47 } 48 49 private static void move(int n, String i, String j) { 50 System.out.println("将第" + n + "个圆盘," + "从" + i + "移动到" + j); 51 } 52 53 54 }

浙公网安备 33010602011771号