美文网首页
分治法实例-汉诺塔

分治法实例-汉诺塔

作者: 借缕春风绽百花 | 来源:发表于2020-07-02 16:04 被阅读0次

1.算法实例——汉诺塔问题

思路:

三个柱子分别为A、B、C,初始状态为盘子都在A上,要求把A的盘子全部移动到C,则需要分三步执行:
① 将A中最上层的n-1个盘子从A移到B
② 将A中最下面也是最大的1个盘子从A移到C
③ 再将之前从A移到B暂存的n-1个盘子从B移动到C

上述三个步骤中,仅有步骤②是直接执行,而步骤①和步骤③都要通过递归实现。

步骤①中,如何把n-1个盘子从A移到B?这可以看成一个新的子问题,而这个子问题跟原问题是一样的,所以我们可以利用递归,再次重复上述的三个步骤就行了,但是,要如何设置参数呢?首先,这个子问题中只有n-1个盘子,所以我们只需要把n改为n-1,其次,要想把n-1个盘子从A移到B,就得先把n-2个盘子从A移到C,依次类推往下,直到最后只需要将一个盘子从A移动到C,然后执行步骤②。
步骤③的原理类似于同步骤②。

具体实现:

public static void move(Tower A,Tower B,Tower C){
        int[] count = {0};
        
        System.out.println(A.toString()+";"+B.toString()+";"+C.toString());
        move(A.size(),A,B,C,count);
    }

接收三个Tower类型参数,对移动步数进行统计,默认为0,打印三个传入参数的初始状态后调用move()函数。

    private static void move(int num, Tower a, Tower b, Tower c,int[] count) {
        
        if(num == 1){
            int m = a.remove();
            c.add(m);
            count[0] ++;
            
            System.out.println(count[0]);
            System.out.println("将"+m+" "+ "从"+a.name+""+"柱 移动到"+" "+c.name+" "+"柱");
            
            Tower first = null,second = null,third = null;
            for(Tower tower: new Tower[]{a,b,c}){
            if(tower.name == "a"||tower.name =="A")
                first = tower;
            else if(tower.name == "b"||tower.name =="B")
                second = tower;
            else if(tower.name == "c"||tower.name =="C")
                third = tower;
            }
            
            System.out.println(first.toString()+";"+second.toString()+";"+third.toString());
            
            
        }else{
            
            move(num-1,a,c,b,count);
            
            
            
            move(1,a,b,c,count);
            
            
            move(num-1,b,a,c,count);
            
            
        }
         
    }
    
     public static void printIF(int[] count,int n,Tower from,Tower to,Tower a,Tower b,Tower c){
         
         if(count[0] == 0){
              System.out.println("初始状态:"+count[0]);
         }
         else if(count[0] > 0){
             System.out.println(count[0]);
         }
        
         if(n != -1&&from != null&&to != null){
             System.out.println("将"+n+" "+ "从"+from.name+"柱 移动到"+to.name+ "柱");
         }
         
          System.out.println("A柱:["+a.toString()+"]");
            System.out.println("B柱:["+b.toString()+"]");
            System.out.println("C柱:["+c.toString()+"]");
 
        }

相关文章

  • 分治法实例-汉诺塔

    1.算法实例——汉诺塔问题 思路: 三个柱子分别为A、B、C,初始状态为盘子都在A上,要求把A的盘子全部移动到C,...

  • 汉诺塔问题(分治法)

  • 汉诺塔问题研究——分治法

    前言 相信学过《数据结构与算法》这门课程的同学都有听过汉诺塔问题,但是可能在大学的时候没有钻研过,或者在学的时候就...

  • 分治算法(汉诺塔)

    将问题分而治之

  • 分治算法——汉诺塔问题

    一、分治算法概念 “分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的...

  • 分治算法——汉诺塔问题

    一、分治算法概念 “分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问...

  • 分治算法(汉诺塔问题)

    一. 算法介绍: 分治算法,其实就是把一个大问题看成若干个小问题,解决了所有的小问题,那么大问题就解决了,原问题的...

  • 递归和分治思想

    递归 例子1.将输入的字符串,倒过来输出。遇到'#'终止。 分治思想 汉诺塔

  • 分治算法实现汉诺塔问题

    分治算法介绍 分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似...

  • 分治算法之汉诺塔问题

    分治法在每一层递归上都有三个步骤 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题 解决:若...

网友评论

      本文标题:分治法实例-汉诺塔

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