Contact me:

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

posted @ 2021-11-08 23:32  impwa  阅读(73)  评论(0编辑  收藏  举报