美文网首页
汉诺塔问题

汉诺塔问题

作者: mcaotuman | 来源:发表于2017-03-03 00:24 被阅读36次

    汉诺塔问题是法国数学家Edouard Lucas发明的。具体可以描述为有三根木桩,初始的时候有n个盘子,最底层的盘子最大,最上层的盘子最小,按大小顺序依次放在第一根木桩上,然后以第二根木桩作为桥梁,全部搬到第三根木桩。

    移动木桩的时候需要注意:
    1.每次只能移动一个盘子。
    2.大盘子必须放在小盘子下面。

    基本算法思想:
    1.将n-1个盘子,从木桩1移到木桩2。
    2.将第n个盘子,从木桩1移到木桩3。
    3.将n-1个盘子,从木桩2移到木桩3。

        /*
         * 将n个盘子由初始木桩移动到目标木桩(利用借用木桩)
         */
        public void hanoi(int n, char from, char denpend_on, char to) {
            if (n == 1)
                // 只有一个盘子是直接将初始木桩上的盘子移动到目的木桩
                move(1, from, to);
            else {
               // 先将初始木桩的前n-1个盘子借助目的木桩移动到借用木桩上
                hanoi(n - 1, from, to, denpend_on);
               // 将剩下的一个盘子移动到目的木桩上
                move(n, from, to); 
               // 最后将借用木桩上的n-1个盘子移动到目的木桩上
                hanoi(n - 1, denpend_on, from, to);
            }
        }
    
        /*
         * 将编号为n的盘子由from移动到to
         */
        private void move(int n, char from, char to) { 
            System.out.println("Move " + n + " from " + from + " to " + to);
        }
    
    

    相关文章

      网友评论

          本文标题:汉诺塔问题

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