前言:

今日打只狼打得吐血了,直接把它给卸载了,然后狠狠地复习了一下深度优先的算法

so现在让我来分享一下深度优先搜索也就是dfs

概述:

深度优先搜索可以理解为一个栈,一直遍历一条路径,直至终点才将这个栈释放,再用栈存储其他路径。

同时该算法和bfs(广度优先搜索)一样只能用于权重一样的题目中,而出现只有大小不一的正权边优先使用Dijksra,含有负权边使用bell ford。

当dfs到达一条终点后它便会回溯,找其他的路径,不断地比较,找到最优解。但值得注意的是深度优先搜素不具有最短性

只有广度优先搜索才具有最短性(即访问最近的点才能具有最短性)。现在让我用例题了解一下深度优先搜索的搜索方式以及回溯过程

#实践:

题目:迷宫

给定一个 N×M 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。

在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<bits/stdc++.h>//懒人万能头
using namespace std;
const int N=1e4,M=1e4;
int g[N][M];
int bx,by,fx,fy;
bool st[N][M];//用来记录一条路径中该点是否走过
int n,m,t;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1,};//表示一点上下左右四个方向移动,避免四个循环重复,增加代码可读性
int cnt;//记录多少中情况
void dfs(int bx,int by){
if(bx==fx&&by==fy){
cnt++;//当有一条路径走到终点,种类数加1
return ;
}
for(int k=0;k<=3;k++){
int tx=bx+dx[k],ty=by+dy[k];
if(!st[bx+dx[k]][by+dy[k]]&&g[tx][ty]==1){
st[bx][by]=true;
dfs(tx,ty);
st[bx][by]=false;//这便是回溯
}
}
}
int main(){
cin>>n>>m>>t;
cin>>bx>>by>>fx>>fy;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
g[i][j]=1;//绘图
}
}
while(t--){
int x, y;
cin>>x>>y;
g[x][y]=0;//设置障碍
}
dfs(bx,by);
cout<<cnt;
return 0;
}