寒假假期训练第三天学习总结及反思 2022/1/5
作者:互联网
一.对深度优先搜索递归方式的初步认识
1.深度优先搜索算法是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。也即它从某一个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解
2主要思想:不撞南墙不回头。
深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问。沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。
二.例题演示
代码展示
#include<iostream>
using namespace std;
char mg[11][11];//位置
int n, m;
bool pd = false;//判断
bool vis[11][11];//判断数组
int dx[] = { -1,0,1,0 };//控制上下的数组
int dy[] = { 0,-1,0,1 };//控制左右的数组
void dfs(int x, int y)
{
vis[x][y] = true;
if (mg[x][y] == 'T')
{
pd = true;//出口位置返回true
return ;
}
for (int i = 0; i < 4; i++)
{
int xt = x + dx[i];
int yt = y + dy[i];
if (xt < 0 || xt >= n || yt < 0 || yt >= m)//越界
continue;
if (vis[xt][yt])
continue;
if (mg[xt][yt] == '*') //撞墙
continue;
dfs(xt, yt);//递归调用dfs
}
}
int main()
{
cin >> n >> m;
int i, j,h,l;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
cin >> mg[i][j];
if (mg[i][j] == 'S')
{
h = i;
l = j;
}
}
dfs(h, l);
if (pd)
cout << "yes" << endl;
else
cout << "no" << endl;
return 0;
}
3.小结
简述算法过程
- 1、任选一顶点作始点 v ,访问该顶点
- 2、沿深度方向,依次遍历 v 的未访问邻接点——直到本次遍历结束
- 3、一次遍历完时,若有未访问顶点:任选一个未访问顶点作起始点,继续第二步。
标签:遍历,int,yt,访问,寒假,2022,反思,顶点,节点 来源: https://blog.csdn.net/m0_64495710/article/details/122323041