深度优先搜索就是从一个分治走到底,
【例题1】给定一个 n 个结点的无向图,要求从 0 号结点出发遍历整个图,求输出整个过程的遍历序列。其中,遍历规则为:
1)如果和 当前结点 相邻的结点已经访问过,则不能再访问;
2)每次从和 当前结点 相邻的结点中寻找一个编号最小的没有访问的结点进行访问;
- 如图1所示,对上图以深度优先的方式进行遍历,起点是 0;
- <1> 第一步,当前结点为 0,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 1;
- <2> 第二步,当前结点为 1,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 3;
- <3> 第三步,当前结点为 3,标记已访问,没有尚未访问的相邻结点,执行回溯,回到结点 1;
- <4> 第四步,当前结点为 1,从相邻结点中找到编号最小的且没有访问的结点 4;
- <5> 第五步,当前结点为 4,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 5;
- <6> 第六步,当前结点为 5,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 2;
- <7> 第七步,当前结点为 2,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 6;
- <8> 第八步,当前结点为 6,标记已访问,没有尚未访问的相邻结点,执行回溯,回到结点 2;
- <9> 第九步,按照 2 => 5 => 4 => 1 => 0 的顺序一路回溯,搜索结束;
案例2,用DFS全排列,输入一个n然后进行排列(1~n)
例如:
输入:3
结果:
123
132
213
231
312
321
代码:
package 备赛课.搜索;
import java.util.Scanner;
public class dfs搜索 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
dfs(0, "", sc.nextInt());
}
//depth用来记录深度
static void dfs(int depth, String ans, int len) {
if (depth == len) {//出口
System.out.println(ans);
return;
}
for (int i = 1; i <= len; i++) {
if (!ans.contains(i + "")) {//看是否有重复的,如果没有重复的继续递归
dfs(depth + 1, ans + i, len);
}
}
}
}