搜索算法的一个经典算法,深度优先搜索!
在这里我将用一个简单的例子,来入门深度优先搜索的思想!核心代码不超过20行。
深度优先搜索的基本模型,理解深度优先搜索的关键在于解决“当下该如何做”。
至于“下一步如何做”则与“当下该如何做”是一样的。比如我们这里写的dfs(step)函数
的主要功能就是解决当你在step步的时候你该怎么办!通常的方法就是把每一种可能都去
尝试一遍。当这一步解决后就进入下一步dfs(step+1)。下一步的解决方法和当前这一步
的解决方法是完全一样的。下面的代码就是深度优先搜索的基本模型:
public static void dfs(int step)
{
判断边界
尝试每一种可能 for(i=1;i<= n;i++)
{
继续下一步 dfs(step+1);
}
返回
}
import java.util.Scanner;
public class quanpailie_sousuo {
static int[] book;// 计数器
static int[] a;// 盒子
static int n;
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
a = new int[10];
book = new int[10];
n = sc.nextInt();
dfs(1);
}
private static void dfs(int step) {
// TODO Auto-generated method stub
if (step == n + 1) {
for (int i = 1; i <= n; i++) {
System.out.print(a[i]);
}
System.out.println();
return;// 返回之前的一步,最近一次调用dfs函数的地方
}
for (int i = 1; i <= n; i++) {
if (book[i] == 0) {// book[i]=0表示i号扑克牌仍然在手上
a[step] = i;// 将i号扑克牌放入第step个盒子中
book[i] = 1;// 将book[i]设为1 , 表示 i 号 扑克牌 已经不在手上了
dfs(step + 1);// 递归调用
book[i] = 0;// 这是非常重要的一步,一定要将刚才尝试的扑克收回,才能进行下一次尝试
}
}
}
}