zoukankan      html  css  js  c++  java
  • 算法15 《啊哈算法》第四章 盒子装扑克-DFS深度优先搜索 递归

    题目

    输入一个数n, 输出l~n 的全排列。
    这里我们先将这个问题形象化,举个例子。假如有编号为1 、2 、3 的3 张扑克牌和编号为l 、2 、3 的3 个盒子。
    现在需要将这3 张扑克牌分别放到3 个盒子里面,并且每个盒子有且只能放一张扑克牌。那么一共有多少种不同的放法呢?

    想法

    我直接写的是n个盒子和m张牌的排列
    深度优先搜索就是先排到最后一步然后往回倒退
    递归实现

    先看代码

    import java.util.Arrays;
    
    class Scratch {
        int[] card= new int[]{1,1,1,1,1,1,1,1,1,1};//点数0-9
        int[] box=new int[4];//0~3四个盒子
        int num_box=box.length;
        //n cards m box show permutation
        public static void main(String[] args) {
            new Scratch().fill(0);//static!
        }
    
         void fill(int num){//put a card into a box
            if(num==num_box)  {
                System.out.println(Arrays.toString(box));
                return;//跳到fill(num+1)后一步
            }
    
            for(int i=0;i<card.length;i++){
                if(card[i]==1){//exist
                    box[num]=i;
                    card[i]=0;//discard
                    fill(num+1);
                    card[i]=1;//排完一个组合跳到这,然后完成这一个for循环
                }
            }
        return;//如果此时是  fill(3),遇到这个 return 就会回到上一级的 fill方法
            也就是fill(2),但此时dfs(2)的大部分语句已经执行了,*只需要接着执行 card[i]=1*
            然后继续进入for循环进入下一次的 fill函数,直到结束。
        }
    }
    

    说实话这个return打了断点也没太看太懂,先记下来!!!!

  • 相关阅读:
    debian7.2+nginx+mysql
    VirtualBox为虚拟OS硬盘扩容
    VirtualBox-Debian7.2-share
    linux 标准化
    linux user date
    Array方法总结
    GET和POST区别 / doGet()和doPost()的区别
    servlet错误:HTTP Status 405
    python类型转换、数值操作
    Architecture:话说科学家/工程师/设计师/商人
  • 原文地址:https://www.cnblogs.com/impw/p/15526875.html
Copyright © 2011-2022 走看看