BFS和DFS

今天学习了两种搜索算法

1.深度优先搜索dfs
2.宽度优先搜索bfs

两种算法有相同也有不同点

都是对整个空间遍历,搜索的空间像一棵树一样 。

dfs先向深搜,搜不到就会回溯。
bfs是一层一层的搜索 。搜索完一层再进入下一层 。
数据结构来看:dfs采用的是栈,bfs采用的是队列。
使用空间看来:dfs大大小于bfs
bfs具有最短路性,dfs没有。(bfs一层一层向下找,先找到的肯定是最短的)。

一:dfs(最重要的是顺序)

需要注意回溯和剪枝两种方法
1.回溯
将搜索过的区域回溯到本来的状态,注意恢复现场。

int n;
int path[N];
bool st[N];
void dfs(int u)
{
	if(u==n)//遍历结束
	{
		for(int i=0;i<n;i++) printf("%d ",path[i]);
		puts("");
		return;
	} 
	for(int i=1;i<=n;i++)
	{
		if(!=st[i])
		{
			path[u]=i;
			st[i]=true;//对i标记 
			dfs(u+1);//递归
			st[i]=false;//递归结束恢复 
		}
	}
}


2.剪枝
剪枝就是提前判断并停止。用acwing的一道例题来展现https://www.acwing.com/problem/content/845/

这道题中我们再遍历的时候会发现有些点无法满足条件,所以我们就可以提前判断并停止走这条路

#include <iostream>
using namespace std;
int n;
const int maxn = 20;
char g[maxn][maxn];
bool col[maxn],dg[maxn],udg[maxn];
void dfs(int u)
{
    if(u == n)
    {
        for(int i = 0;i < n;i++)    puts(g[i]);
        puts("");
    }
    for(int i = 0;i < n;i++)//枚举第i行在哪一列放置皇后
    {
        if(!col[i] && !dg[i + u] && !udg[n - u + i])//剪枝
        {
            g[u][i] = 'Q';
            col[i] = dg[i + u] = udg[n - u + i] = true;
            dfs(u + 1);
            g[u][i] = '.';//回溯
            col[i] = dg[i + u] = udg[n - u + i] = false;
        }
    }
}
int main()
{
    cin>>n;
    for(int i = 0;i < n;i++)
        for(int j = 0;j < n;j++)
            g[i][j] = '.';
    dfs(0);
    return 0;
}

我对dfs的理解就是dfs算法是一种基于递归的算法。搞懂递归就能理解大半。

二.bfs

bfs属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

核心代码如下

//Vs 起点 
//Vd 终点 
bool BFS(Node& Vs, Node& Vd)
{  
    queue<node> Q;  
    Node Vn, Vw;  
    int i;  
    //初始状态将起点放进队列Q  
    Q.push(Vs);  
    hash(Vw) = true;//设置节点已经访问过了!  
    while (!Q.empty()){//队列不为空,继续搜索!  
        //取出队列的头Vn  
        Vn = Q.front();  
        //从队列中移除  
        Q.pop();  
        while(Vw = Vn通过某规则能够到达的节点)
		{  
            if (Vw == Vd)//找到终点了!
			{  
                //把路径记录,这里没给出解法  
                return true;//返回  
            }  
            if (isValid(Vw) && !visit[Vw])//Vw是一个合法的节点并且为白色节点
			{  
                Q.push(Vw);//加入队列Q  
                hash(Vw) = true;//设置节点颜色  
            }  
        }  
    }  
    return false;//无解  
}

对于bfs的应用最直观的就是走迷宫的最短路线。所以很多最短路线的算法都是基于bfs的思想的

而dfs的优势则在于所需的空间小。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值