2021-10-09

这期带来 深度优先算法(DFS)
这个深度优先搜索属于图算法的一种,是一个针对图和树的深度优先搜索是图论中的经典算法,我们利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题遍历算法,英文缩写为DFS即Depth First Search。
其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
深度优先的基本原则:即按照某种条件往前试探搜索,如果前进中遭到失败(正如老鼠遇到死胡同)则退回头另选通路继续搜索,直到找到满足条件的目标为止。
**关于DFS的运用如下:
例题:
走迷宫:

给一个n行m列的2维的迷宫,‘S’表示迷宫的起点,‘T’表示迷宫的终点,’#‘表示不能通过的点,’.’ 表示可以通过的点。 你需要从’S’出发走到’T’,每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。

输入格式 :
第一行输入n,m(1≤n,m≤10)表示迷宫大小。接下来输入n 行字符串表示迷宫
输出格式:
输出通过迷宫的方法数
样例输入
2 3

S.#

…T
样例输出
2
具体代码如下:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std;
8 typedef long long ll;
9
10 //调用Enter函数和DFS函数
11 void Enter();
12 void DFS(int i,int j);
13 int n,m,x,y,way;//n,m记录迷宫大小,x,y记录’S’的地址, way记录路径的数量
14 char Maze[10][10];//存储迷宫
15 int Flag[10][10];//在DFS函数中标记 0为没经过,1为已经经过
16
17
18 int main()
19 {
20 int i,j;
21 cin>>n>>m;
22 for(i=0;i<n;i++)
23 {
24 for(j=0;j<m;j++)
25 {
26 cin>>Maze[i][j];
27 }
28 }
29 Enter();//查找入口’S’位置,记录其坐标x,y位置
30 DFS(x,y);//用深度优先搜索函数统计其路径
31 cout<<way<<endl;
32
33 return 0;
34 }
35
36 void Enter()
37 {
38 for(int i=0;i<n;i++)
39 {
40 for(int j=0;j<m;j++)
41 {
42 if(Maze[i][j]=‘S’)
43 {
44 x=i;
45 y=j;
46 return;
47 }
48 }
49 }
50 }
51
52 void DFS(int i,int j)
53 {
54 if(i<0||j<0||i>=n||j>=m)
55 {
56 return;
57 }
58 if(Maze[i][j]‘T’)
59 {
60 way++;
61 return;
62 }
63 else if(Maze[i][j]
’#’)
64 {
65 return;
66 }
67 else
68 {
69 if((Maze[i][j]’.’||Maze[i][j]‘S’)&&Flag[i][j]==0)
70 {
71 Flag[i][j]=1;
72 //迭代的过程
73 DFS(i,j+1);//向上遍历
74 DFS(i+1,j);//向右遍历
75 DFS(i,j-1);//向下遍历
76 DFS(i-1,+j);//向左遍历
77
78 Flag[i][j]=0;
79 }
80 }
81 }``

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值