• 算法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打了断点也没太看太懂,先记下来!!!!

  • 相关阅读:
    博客园20071027上海聚会
    上海招聘.NET(C#)程序员
    招人
    漂亮的后台WebUi框架(有源码下载)
    js插件库系列导航
    PrestoSQL(trinodb)源码分析 执行(下)
    Extjs4 (二)
    Struts2(1)简介
    css中的字体
    什么是REST架构
  • 原文地址:https://www.cnblogs.com/impw/p/15526875.html
Copyright © 2020-2023  润新知