详解:分治算法【Java实现】——汉诺塔问题

分治算法:

一,分治算法介绍

二,分治算法的基本步骤:

分治算法最佳实践-汉诺塔:

汉诺塔的传说:​

汉诺塔游戏的演示和思路分析:

汉诺塔游戏的Java代码实现:


一,分治算法介绍

        分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题 直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…

二,分治算法的基本步骤:

分治法在每一层递归上都有三个步骤:

1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题

2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

3)合并:将各个子问题的解合并为原问题的解。

分治算法最佳实践-汉诺塔:

汉诺塔的传说:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如上图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

汉诺塔游戏的演示和思路分析:

一,如果是只有一个盘, 移动:A-C

二,如果我们有n>=2情况,我们总是可以看做是两个盘:一个是最下边的盘(一个),一个是上面的盘(多个)

1)先把最上面的盘,移动:A->B

2)把最下边的盘,移动:A->C

3)把B塔的所有盘,移动:B->C

汉诺塔游戏的Java代码实现:

public class Hanoitower {//汉诺塔

    public static void main(String[] args) {
        //测试
//        hanoiTower(1,'A','B','C');//1个盘
//        hanoiTower(2,'A','B','C');//2个盘
//        hanoiTower(3,'A','B','C');//3个盘
        hanoiTower(5, 'A', 'B', 'C');//5个盘

    }

    /**
     * 汉诺塔移动的方法
     * 使用分治算法:
     * @param num 光盘的个数
     * @param a
     * @param b
     * @param c
     */
    public static void hanoiTower(int num, char a, char b, char c) {
        if (num == 1) {
            System.out.println("第1个盘:从" + a + "-->>" + c);
        } else if (num >= 2) {
            //如果我们有n>=2情况,我们总是可以看做是两个盘:1最下边的盘(一个)2,上面的盘(多个)
            //1 先把最上面的盘a-->>b,移动过程会使用到c
            hanoiTower(num - 1, a, c, b);//递归
            //2 把最下面的盘a-->>c
            System.out.println("第" + num + "个盘:从" + a + "-->>" + c);
            //3 把b塔的所有盘从b-->>c,移动过程会使用到a塔
            hanoiTower(num - 1, b, a, c);//递归
        }
    }
}

长风破浪会有时,直挂云帆济沧海!

猜你喜欢

转载自blog.csdn.net/m0_52729352/article/details/121934468