参考《啊哈!算法》一书,P79页。
题目要求:
将N张牌放在N个桶里面,问有多少种放法?本质是全排列问题。
个人理解:
使用深度优先搜索方法,初始时不能理解为什么会产生回溯,个人理解为断点处的再执行。例如代码中使用函数递归,dfs(1)中调用dfs(2),dfs(2)中调用dfs(3)等等。
for(int i =1;i<=n;i++)
{
if(book[i] == 0)
{
arr[step] = i;
book[i] = 1;
dfs(step+1);
book[i] = 0;
}
}
为什么会产生回溯,例如在执行dfs(2)时,只有当dfs(3)完全执行结束,才会执行代码dfs(2)中book[i] = 0;所以才会造成回溯。断点的再继续。
完整代码:
import java.util.Scanner;
public class Dfs {
int [] arr = new int [10];
int [] book = new int [10];
int n;
public static void main(String[] args) {
Dfs dd = new Dfs();
Scanner sc = new Scanner(System.in);
dd.n = sc.nextInt();
for(int i =0;i<10;i++){
dd.book[i]=0;
}
dd.dfs(1);
}
public void dfs(int step){
if(step==n+1){
for(int i =1;i<=n;i++){
System.out.print(arr[i]);
}
System.out.println();
return;
}
for(int i =1;i<=n;i++){
if(book[i] == 0){
arr[step] = i; // 把第i张牌放在第step桶里
book[i] = 1; // 把该张牌(i)标记为1;说明该张牌已经不掌握;
dfs(step+1); // 执行下一步
// System.out.println(i);
book[i] = 0;
}
}
// return ;
}
}
样例输入:
3
样例输入:
123
132
213
231
312
321