zoukankan      html  css  js  c++  java
  • 汉诺塔实现方法

    首选,规定一个包含有栈的类,对应抽象汉诺塔

            class HanoiStack
            {
                public string TowerName { get; set; }     //对应汉诺塔的塔名称,如:A,B,C
                public Stack<int> TowerStack { get;set; } //栈,先进后出,跟汉诺塔的玩法很相符
            }
    

    然后,汉诺塔的搬运规则,其核心就是:当若只有一个盘时,直接将盘从源塔柱搬移到目标塔柱,否则,递归上一步搬移,直至仅有一个盘

    即,n=1,源塔柱 --> 目标塔柱;n>1,递归直至仅有一个盘

            /// <summary>
            /// 汉诺塔搬运规律
            /// </summary>
            /// <param name="n">总的盘数</param>
            /// <param name="from">源塔柱</param>
            /// <param name="to">目标塔柱</param>
            /// <param name="transfer">中转塔柱</param>
            private void Hanoi(int n, HanoiStack from, HanoiStack to, HanoiStack transfer)
            {
                if (n <= 1) HanoiMove(from, to, transfer);  //只有一个盘,则直接从源塔柱搬移到目标塔柱,否则递归直至仅有一个盘
                else
                {
                    Hanoi(n - 1, from, transfer, to);
                    Hanoi(1, from, to, transfer);
                    Hanoi(n - 1, transfer, to, from);
                }
            }
    

    再就是,搬运以及打印显示,打印显示的方式个人开心就好

            private void HanoiMove(HanoiStack from, HanoiStack to, HanoiStack transfer)
            {
                to.TowerStack.Push(from.TowerStack.Pop());  //搬运,从 源塔柱 中取出最顶端的一个“盘”,放入 目标塔柱 的顶端
                RichTextBoxAppendLine(richTextBox_Hanoi, $" Move No.{to.TowerStack.Peek()}:{from.TowerName} -> {to.TowerName} via {transfer.TowerName}", Color.DarkSeaGreen, true);  //打印显示
            }
    

    最后,函数调用

            private void Hanoi_Start(int total)
            {
                int n = total;
                HanoiStack a = new HanoiStack() { TowerName = "A", TowerStack = new Stack<int>() };
                HanoiStack b = new HanoiStack() { TowerName = "B", TowerStack = new Stack<int>() };
                HanoiStack c = new HanoiStack() { TowerName = "C", TowerStack = new Stack<int>() };
                while (total-- > 0) a.TowerStack.Push(total + 1); //初始化栈
                Hanoi(n, a, c, b);
            }  

    运行效果,测试用例是:15,汉诺塔的搬移步骤总数为,2 的 n 次方减 1,即:2^n-1,

    当 n=15,搬移的步骤总数为:2^15-1 = 32767,

    运行结果,搬移步骤总数为 32767,耗时 03分03秒 50毫秒

    搬移过程,下图所示,如:Move No.1:A -> C via B   ,

      表示:将1号盘(No.1)从 A 塔柱通过 B 塔柱搬移到 C 塔柱

      实际操作为:直接将 1号盘(No.1)从 A 塔柱搬移到 C 塔柱

      


    author:韦小明

    本文即原文:汉诺塔实现方法

    本文路径:https://www.cnblogs.com/youler/p/13814935.html

  • 相关阅读:
    生产者消费者模型
    查看网络通不通的几种方法
    tomcat在45秒内没有启动,启动超时
    request获取各种路径
    修改web项目发布路径
    web.xml不同版本的头
    Web.xml 错误或异常页面配置
    ModelAndView command
    java初始化顺序
    初始化时的过程
  • 原文地址:https://www.cnblogs.com/youler/p/13814935.html
Copyright © 2011-2022 走看看