程帅霞

不断受挫,不停起身,不断追寻,不止AC~~

导航

dfs和bfs

1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索出来,它运用了回溯,保存这次的位置,深入搜索,都搜索完了便回溯回来,搜下一个位置,直到把所有最深位置都搜一遍,要注意的一点是,搜索的时候有记录走过的位置,标记完后可能要改回来;

回溯法是一种搜索法,按条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法;

例如这张图,从1开始到2,之后到5,5不能再走了,退回2,到6,退回2退回1,到3,一直进行;

理解这种方法比较简单,难的是要怎么用

void dfs(int deep)
{
	int x=deep/n,y=deep%n;
	if(符合某种要求||已经不能在搜了)
	{
		做一些操作;
		return ;
	}
	if(符合某种条件且有地方可以继续搜索的)//这里可能会有多种条件,可能要循环什么的
	{
		a[x][y]='x';//可能要改变条件,这个是瞎写的
	        dfs(deep+1,sum+1);//搜索下一层
		a[x][y]='.';//可能要改回条件,有些可能不用改比如搜地图上有多少块连续的东西
	}
}

2.bfs(宽度/广度优先搜索),这个一直理解了思想,不会用,后面才会的,思想,从某点开始,走四面可以走的路,然后在从这些路,在找可以走的路,直到最先找到符合条件的,这个运用需要用到队列(queue),需要稍微掌握这个才能用bfs。


一张图,bfs就是和它类似,很好的帮助理解,雷从上往下,同时向四面八方的延长(当然不是很严谨的),然后找到那个最近的建筑物,然后劈了它;

还是这张图,从1开始搜,有2,3,4几个点,存起来,从2开始有5,6,存起来,搜3,有7,8,存起来,搜4,没有了;现在开始搜刚刚存的点,从5开始,没有,然后搜6.。。一直进行,直到找到;

int visit[N][N]//用来记录走过的位置
int dir[4][2]={0,-1,0,1,-1,0,1,0};
struct node
{
	int x,y,bits;//一般是点,还有步数,也可以存其他的
};
queue<node>v;
void bfs1(node p)
{
	node t,tt;
	v.push(p);
	while(!v.empty())
	{
		t=v.front();//取出最前面的
		v.pop();//删除
		if(找到符合条件的)
		{
			做记录;
			while(!v.empty()) v.pop();//如果后面还需要用,随手清空队列
			return;
		}
		visit[t.x][t.y]=1;//走过的进行标记,以免重复
		rep(i,0,4)//做多次查找
		{
			tt=t;
			tt.x+=dir[i][0];tt.y+=dir[i][1];//这里的例子是向上下左右查找的
			if(如果这个位置符合条件)
			{
				tt.bits++;//步数加一
				v.push(tt); //把它推入队列,在后面的时候就可以用了
			}
		}
	}
}

3.dfs和bfs的区别

其实有时候两个都可以用,不过需要其他的东西来记录什么的,各自有各自的优势

bfs是用来搜索最短径路的解法是比较合适的

posted on 2020-12-27 15:21  程帅霞  阅读(127)  评论(0编辑  收藏  举报