dfs基本思想
一.背景
本人在学习了acwing的算法基础课后,对dfs算法有了一定的理解,于是写下了下面的博客。
二.dfs基本介绍
DFS(Depth First Searching)是一种基于递归的算法,其中文名为深度优先搜索算法,那么我们先来通过一个简单的深搜过程了解一下DFS算法的工作原理。
上图就是dfs在遍历过程的顺序,总结下来就是dfs在遍历过程中会选择一条路走到黑,走完一条路后,回溯一小格,看看另外的分支有每有路可以走。
三.例题
代码如:
import java.util.*;
public class Main{
private static int N = 10;
private static int n;
private static int[] path = new int[N];
private static boolean[] st = new boolean[N];
public static void dfs(int u){
if(u == n){
for(int i = 0 ; i < n ; i++){
System.out.print(path[i]+" ");
}
System.out.println();
return;
}
for(int i = 1 ;i <= n ; i++){
if(!st[i]){
path[u] = i;
st[i] = true;
dfs(u+1);
path[u] = 0;//恢复现场
st[i] = false;//恢复现场
}
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
dfs(0);
sc.close();
}
}
n皇后问题
代码如下:
import java.util.*;
public class Main{
public static int N = 20;
public static int n;
public static char[][] arr = new char[N][N];
public static boolean[] dg = new boolean[N];//判断主对角线位置能否放
public static boolean[] udg = new boolean[N];//判断负对角线能否放
public static boolean[] col = new boolean[N];
public static void dfs(int u){
if(u == n){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
System.out.print(arr[i][j]);
}
System.out.println();
}
System.out.println();
return;
}
for(int i = 0 ; i < n ;i++){
if(!col[i] && !dg[u+i] && !udg[n-u+i]){
arr[u][i] = 'Q';
col[i] = dg[u+i] = udg[n-u+i] = true;
dfs(u+1);
arr[u][i] = '.';
col[i] = dg[u+i] = udg[n-u+i] = false;
}
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
arr[i][j] = '.';
}
}
dfs(0);
sc.close();
}
}
四.总结提升
- 在学习dfs算法时,可以通过画出上述的树形结构模拟该题dfs的过程
- dfs在搜索的时候就是按照字典序进行排序的了
- dfs过后记得恢复现场