深度优先搜索

   深度优先搜索,简称dfs,考场常用暴力枚举手段之一,得分随缘,提前退役的有效途径(去年noip dfs第二题12分,第三题0分);

虽然看起来dfs莫得卵用,但他确实莫得卵用(如果我们不优化),我们还是要学(wy还是要求我们写),就当是复习好了(如果考裸题我当场吃屏幕)。

作为搜索的一种方式,dfs的关键词是深度优先,什么是深度优先呢?

举个例子,假如小T要从自己家到小A家玩,可能经过如超市,学校,小W家或小Y家等场所,现在已知场所Xi分别连接了场所Y1——Yj,求有多少种路径可以到达?

dfs就是一条路先走到底,如果可行就令答案加一,再继续从头走下一条路,而与之相对的bfs(广度优先搜索)则是每走到一个场所,就将接下来能走到的所有场所的信息存下来,挨个枚举(更容易爆)

不会做图,所以下面挖了一张别人博客的示意图

bfs

 

 

dfs

 

代码实现的话,一般都是用函数,因为要递归,刚学可能比较恶心,习惯就好,这里以洛谷

P1706 全排列问题

为例

我滴任务完成了

复制代码
#include<bits/stdc++.h>
using namespace std;
int n,mark[10],ans[10];
//n->序列长度,mark->记录某个数是否使用过,以保证序列不重复 
void dfs(int u)
{
    //递归出口
    if(u==n+1)
    {
        for(int i=1;i<=n;i++)cout<<"    "<<ans[i];
        cout<<endl;
        return;
    }
    //枚举序列第u位的数字 
    for(int i=1;i<=n;i++)
    {
        //如果当前数字未使用过 
        if(mark[i]==0)
        {
            //标记 防重复 
            mark[i]=1;
            //向更深一层遍历,即枚举第u+1位的数字 
            ans[u]=i; 
            dfs(u+1);
            //数字i已经使用过了,将i取出,使mark[i]=0,防止阻碍后面使用i 
            mark[i]=0; 
        } 
    } 
    return; 
} 
//u->已构建的序列长度 
int main()
{
    cin>>n;
    dfs(1);
    return 0;
 } 
复制代码

 

posted @   zxtd  阅读(190)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示