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