美文网首页
汉诺塔问题

汉诺塔问题

作者: stoneyang94 | 来源:发表于2018-08-26 00:10 被阅读0次

    题目(算法课第八课)

    古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤 。

    分析

    递归。
    划分为子问题。

    步骤

    所以整个步骤:
    1.搬运n-1个碟子到中间针(from -> help)(递归)
    2.搬运第n个碟子到目的针 (from -> to)
    3.搬运中间针的n-1个碟子到目的针(help -> to)(递归)

    递归调用只要有整体观念就行了,在写代码的过程中可以把移动n-1个塔看作一步完成的

    代码

    public class Hanoi {
        static int b = 0;
        public static void hanoi(int n, String from, String help, String to) {
            if (n == 1) {//base case
                System.out.printf("%d号盘:%s-->%s\n", n, from, to);
                b++;
            } else {
            //1.搬运n-1个碟子到中间针(from -> help)(递归) 
                hanoi(n - 1, from, to, help);
            //2.单独搬运第n个碟子到目的针 (from -> to)
                System.out.printf("%d号盘:%s-->%s\n", n, from, to);
            //3.搬运中间针的n-1个碟子到目的针(help -> to)(递归) 
                hanoi(n - 1, help, from, to);
                b++;
            }
        }
    
        public static void main(String[] args) {
            int n = 4;
            hanoi(n, "A", "B", "C");
            System.out.println("一共搬运的次数"+b);
        }
    }
    

    输出:

    1号盘:A-->B
    2号盘:A-->C
    1号盘:B-->C
    3号盘:A-->B
    1号盘:C-->A
    2号盘:C-->B
    1号盘:A-->B
    4号盘:A-->C
    1号盘:B-->C
    2号盘:B-->A
    1号盘:C-->A
    3号盘:B-->C
    1号盘:A-->B
    2号盘:A-->C
    1号盘:B-->C
    15
    

    相关文章

      网友评论

          本文标题:汉诺塔问题

          本文链接:https://www.haomeiwen.com/subject/cyrgiftx.html