汉诺塔问题

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 }

 

posted @ 2018-09-27 10:53  几忆年少红尘客  阅读(146)  评论(0)    收藏  举报