其他分享
首页 > 其他分享> > 寒假假期训练第三天学习总结及反思 2022/1/5

寒假假期训练第三天学习总结及反思 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.小结

简述算法过程

标签:遍历,int,yt,访问,寒假,2022,反思,顶点,节点
来源: https://blog.csdn.net/m0_64495710/article/details/122323041