zoukankan      html  css  js  c++  java
  • 汉诺塔算法

    一个印度传说:在一个神庙里有有一个汉诺塔,就是一个铜板上插着3个宝石针,其中一根针从上到下的穿着由小到大的铜片64片,僧人们一次只能移动一个铜片,并且不论移到哪个针上,必须保持小片在大片上面。僧侣们预言,当所有的铜片都从穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消亡。

    当然,这只是个传说,如果每秒钟移动一次,那么移完这个汉诺塔将耗费大约 5845亿年,到那时说不定又有新的星系被人类发现了。

    汉诺塔算法可以根据推理得出:

    public class HanioDemo
    {
        //把第几个盘子从哪个杆子上移动到哪个杆子上
        private void Move(int iNum, char cSource, char cDest)
        {   
            Console.WriteLine("把第{0}个盘子从杆子{1}上移动到杆子{2}上", iNum, cSource, cDest);
        }
    
        //移动第几个盘,从第几个杆子到第几个杆子
        public void Hanoi(int n, char cSource, char cTemp, char cDest)
        {
            if (1 == n)
            {
                Move(1, cSource, cDest);
            }
            else if (2 == n)
            {
                //2个盘的汉诺塔也可以归纳为
    
                //经过第三次改造,抽象,发现n==2的情况和n==3的情况完全一样
                //所以,继续改造,第四次了。
    
                //Hanoi(1, cSource, cDest, cTemp);
                Hanoi(n - 1, cSource, cDest, cTemp);
    
                //Move(1, cSource, cTemp);
    
                //Move(2, cSource, cDest);
                Move(n, cSource, cDest);
    
                //Hanoi(1, cTemp, cSource, cDest);
                Hanoi(n - 1, cTemp, cSource, cDest);
    
                //Move(1, cTemp, cDest);
            }
            else if (3 < n)
            {
                /*
                Move(1, cSource, cDest);
                Move(2, cSource, cTemp);
                Move(1, cDest, cTemp);*/
                //归纳:前三步移动可以归结为2个汉诺塔的移动
                //Hanoi(2, cSource, cDest, cTemp);
    
                //第三次修改,将具体数字用n表示,再次抽象!
                Hanoi(n - 1, cSource, cDest, cTemp);
                //Move(3, cSource, cDest);
                Move(n, cSource, cDest);
    
                //Hanoi(2, cTemp, cSource, cDest);
                Hanoi(n - 1, cTemp, cSource, cDest);
    
                //后三步也很像2个汉诺塔移动
                /*
                Move(1, cTemp, cSource);
                Move(2, cTemp, cDest);
                Move(1, cSource, cDest);*/
            }    
        }
    }

    最终抽象出来的方法:

    /// <summary>
    /// 汉诺塔抽象出的最终方法
    /// </summary>
    /// <param name="n">盘子的个数</param>
    /// <param name="cSource">第一个杆子</param>
    /// <param name="cTemp">第二个杆子</param>
    /// <param name="cDest">第三个杆子</param>
    public void HanoiDone(int n, char cSource, char cTemp, char cDest)
    {
        if (n < 1)
        {
            Console.WriteLine("盘子的数量必须是自然数!");
            return;
        }
        else if(1==n)
        {
            Move(1, cSource, cDest);
        }
        else
        {
            HanoiDone(n - 1, cSource, cDest, cTemp);
            Move(n, cSource, cDest);
            HanoiDone(n - 1, cTemp, cSource, cDest);
        }
    }
  • 相关阅读:
    智慧光伏能源-园区光伏发电能源管控可视化
    无人值守,智能变电站可视化管控系统
    数字孪生,开启三维智慧园区管理新篇章
    智慧城市大数据运营中心 IOC 之 Web GIS 地图应用
    三维可视化数据中心机房监控管理系统
    打造绿色城市,数字孪生天然气站 3D 可视化
    绿色物流-智慧仓储监控管理 3D 可视化系统
    打造综合性智慧城市之朔州开发区 3D 可视化
    绿色城市之地下综合管廊3D可视化平台
    工业绿色环保发展:风力发电场管理监测可视化系统
  • 原文地址:https://www.cnblogs.com/fanyong/p/3003076.html
Copyright © 2011-2022 走看看