深度优先搜索(dfs)暴力偏入门向(1)

c++深度优先搜索DFS 深度优先搜索,又叫DFS,是遍历图或者数的一种算法,本质就是递归。具体方法:先以一个节点为起点,向一个方向扩展,再以新的节点为起点,向一个方向扩展,直到这个方向不满足条件,或者到达这个方向的最深,再往回走,叫做回溯。然后扩展另一个方向,知道整个图都遍历完成。所以叫做深度优先搜索。这种算法极其重要,是每一个会编程的人都必须掌握的一种算法。因为许多东西都可以用它来实现。比如树的遍历,图的遍历,全排列。而且很多题目,如果你不会或者想不出正解,就可以用深搜暴力一下,也能骗得部分分。 阅读详情

几道比较不错的深搜练习题(迷宫、红与黑、马走日、单词接龙,纯暴力无优化无剪枝)

写出深搜很重要的两点:1递归搜索树 2明确当前的状态
在这里插入图片描述来源:acwing

//剖析一下自己写的深搜代码
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 110;

int k, n;
int a, b, c, d;
char g[N][N];
int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
bool st[N][N];

bool dfs(int x, int y){                         //我用的是带返回值的dfs函数,也可以用一个不带返回值的,但是需要用变量标记一下
    if(x == c && y == d)    return true;        //终止条件
    st[x][y] = true;
    for(int i = 0;i < 4;i++){
        int tx = x + dx[i], ty = y + dy[i];
        if(tx < 1 || tx > n || ty < 1 || ty > n)    continue;
        if(st[tx][ty] || g[tx][ty] == '#')    continue;
        if(dfs(tx, ty))    return true;         //从终止条件那里一直迭代回到根节点
    }
    return false;                               //这个false只有在第一层才会有效果
}

int main(){
    cin >> k;
    while(k--){
        memset(st, false, sizeof st);
        cin >> n;
        for(int i = 1;i <= n;i++)
            for(int j = 1;j <= n;j++)
                cin >> g[i][j];
        cin >> a >> b >> c >> d;
        a ++ , b ++ , c ++ , d ++;              //注意下标起始位置,习惯从1开始的要注意这道题给的起点
        if(g[a][b] == '#'){                     //小坑:起点处就是障碍物那么肯定到不了
            cout << "NO" << endl;
            continue;
        }
        cout << (dfs(a, b) ? "YES" : "NO") << endl;
    }
    return 0;
}

在这里插入图片描述
来源:acwing

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 25;

int n, m;
char g[N][N];
bool st[N][N];
int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

int dfs(int x, int y){                                       //应用带返回值的dfs
    st[x][y] = true;                                         //连通性问题无需回溯
    int sum = 1;                                             //当前这个结点默认有1个
    for(int i = 0;i < 4;i++){
        int tx = x + dx[i], ty = y + dy[i];
        if(tx < 1 || tx > n || ty < 1 || ty > m)    continue;
        if(st[tx][ty] || g[tx][ty] == '#')    continue;
        sum += dfs(tx, ty);                                  //把从这个点遍历的加回来,相当于动态规划的感觉
    }                                                        //第一层返回的就是我们要的结点数
    return sum;
}

int main(){
    while(cin >> m >> n, n | m){
        memset(st, false, sizeof st);
        int x, y;
        for(int i = 1;i <= n;i++)
            for(int j = 1;j <= m;j++){
                cin >> g[i][j];
                if(g[i][j] == '@')    x = i, y = j;
            }
        cout << dfs(x, y) << endl;    
    }
    return 0;
}

在这里插入图片描述
来源acwing

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 13;

int t;
int n, m, x, y;
bool st[N][N];
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1}, dy[] = {-2, -1, 1, 2, 2, 1, -1, -2};

int dfs(int x, int y, int s){                     //加个参数方便判断是否走全
    if(s == n * m)    return 1;
    int ans = 0;                                  //记录一下
    st[x][y] = true;
    for(int i = 0;i < 8;i++){
        int tx = x + dx[i], ty = y + dy[i];
        if(tx < 1 || tx > n || ty < 1 || ty > m)    continue;
        if(st[tx][ty])    continue;
        ans += dfs(tx, ty, s + 1);
    }
    st[x][y] = false;                             //需要回溯
    return ans;
}

int main(){
    cin >> t;
    while(t--){
        memset(st, false, sizeof st);
        cin >> n >> m >> x >> y;
        x ++ , y ++;
        cout << dfs(x, y, 1) << endl;
    }
    return 0;
}

在这里插入图片描述
来源:acwing

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <unordered_map>

using namespace std;

const int N = 30;

int n, d, length, ans;
char c;
string str[N];
unordered_map<string, int> m;

int is_fixed(string s, string t){      //算最少重合数
    int res = 0;
    for(int i = 1;i < min((int)s.size(), (int)t.size());i++){
        res = i;
        for(int j = 0;j < i;j++)
            if(s[s.size() - i + j] != t[j]){
                res = 0;
                break;
            }
        if(!res)    continue;
        else    return res;
    }
    return res;
}

int dfs(string s){
    ans = max(ans, (int)s.size());
    string q = s;
    for(int i = 0;i < n;i++){
        if(m[str[i]] && (d = is_fixed(s, str[i]))){
            s += str[i].substr(d, str[i].size() - d);
            m[str[i]]--;
            dfs(s);
            s = q;
            m[str[i]]++;                                      //回溯
        }
    }
    return ans;
}

int main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);     //加速
    cin >> n;
    for(int i = 0;i < n;i++){    
        cin >> str[i];
        m[str[i]] = 2;
    }
    cin >> c;
    for(int i = 0;i < n;i++)
        if(str[i][0] == c){
            ans = 0;
            m[str[i]]--;
            length = max(length, dfs(str[i]));
        }
    cout << length << endl;
    
    return 0;
}
【C++算法】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】 【C++算法1】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】 阅读详情

相关推荐

c++深度优先搜索详解

哈喽 哈喽 今天没啥事,来发一下c++里的深度优先搜索(dfs) 这个算法其实比较简单,看一眼就会了 dfs是啥 DFS(Depth First Search),即深度优先搜索,是一种遍历图的方式。 比如这张图(用鼠标写数字有点丑) 我们要找到4这个值 假设从1开始找 1没找到 再找2,2也没找到, 找3,3又没找到 发现已经走到头了 再一步一步回溯到1,走另外一条路,找到了4 总结一下,dfs会在搜索到新点时优先访问以改点为起点的子节点,并在所有子节点访问完...

我的博客 5824

你还不会暴力搜索吗,dfs(深度优先搜索)详解,看这一篇就够啦

DFS算法的基本思想是从图中的某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,整个进程反复进行直到所有顶点都被访问为止。指数型枚举是指一共有n个数,每一个数都有两种状态,也就是选或不选,时间复杂度也就是2^n,指数级的。

2202_76097976的博客 7525

【算法】蓝桥杯dfs深度优先搜索之排列组合总结

  上一篇文章 → 《【算法】蓝桥杯dfs深度优先搜索之凑算式总结》   为了重申感谢之意,再次声明下文的大部分灵感均来自于【优快云】梅森上校《JAVA版本:DFS算法题解两个例子(走迷宫和求排列组合数)》   强烈大家去上面那篇文章看看,写的很好。   下面我会列出蓝桥杯第六届B组省赛第7题、第七届第5题、第八届第4题,共3道题。   因为他们都是:排列组合。 【第一道题】   这道题可以强...

midnight_time的博客 4068

深度优先搜索(DFS)(算法笔记)

深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,总是以“深度”作为前进的关键词。实现方式是有很多,最常见的是递归。深度优先搜索属于搜索问题的一种,当问题可以被描述为“路径搜索”时,就可以采用搜素问题的所有解的方式来进行解决,所以DFS本质还是暴力。深度搜索具有两个关键词,即“岔道口”和“死胡同”,这两个词来源于迷宫问题,这也是搜索问题最原始的表现。当碰到岔道口时,总是以“深度”作为前进的关键词,不碰到死胡同就不回头,因此被称为“深搜”。

Arabot_的博客 1万+

深度优先算法DFS入门 (超级简单的例题入门)

参考文章: 1、Leetcode Subset I & II 作者:算法鱼 (里面是java版本的代码) 一、什么是 DFS? 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 具体做法是:假设初始状态是图中所有顶点均未被访问,则从某个顶点V出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V有路径相通的顶点都被...

刷刷刷,刷Leetcode 1455

深度优先搜索之记忆化dfs

文章目录前言朴素dfs的求解思路记忆化dfs的求解思路将整数按权重排序题目描述解题思路朴素dfs记忆化dfs小结矩阵中的最长递增路径题目描述解题思路朴素dfs记忆化dfs小结统计所有可行路径题目描述解题思路朴素dfs记忆化dfs小结学生出勤记录 II题目描述朴素dfs记忆化dfs小结“马”在棋盘上的概率题目描述记忆化dfs骑士拨号器题目描述记忆化dfs记忆化dfs与棋结语 前言 前不久,我写一篇bfs的进阶版双向bfs:广度优先搜索之双向bfs 这篇文章主要是讲述对于一些特定的bfs问题,可以使用两头齐搜的

Rookie 4193

深度优先搜索算法

    本文主要部分来源于微信公众号:算法文摘,自己感悟和习题的练习。(侵删)    1. 深度优先搜索算法的概念:        深度优先搜索属于图算法的一种,英文缩写为DFS(Depth First Search.)其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。如下例:                该图为一个无向图,假设我们从A开始进行深度优先搜索,第...

victoryshen的博客 2万+

算法第六期——DFS初入门(深度优先搜索)(Python)

深度优先搜索算法 ( DFS )是一种用于遍历或搜索 树 或 图 的 算法 。这个算法会尽可能深的搜索树的分支。. 当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。这种算法不会根据图的结构等信息调整执行策略

荷叶田田的博客 8978

【深度优先搜索篇】带你暴力dfs去破解飞机降落和八皇后问题(轻松拿捏版)

什么还在被洛谷的八皇后,飞机降落问题困扰,此篇带你无痛解答它们。

羑悻的博客. 3607

C++深度优先搜索DFS

扩展新的节点,不断递归执行这个过程,直到某个节点不能再扩展下一个节点为止。此时,则返回上一个节点重新寻找一个新的扩展节点。如此搜索下去,直到找到目标节点,或者搜索完所有节点为止。

闻缺陷则喜何志丹 1753

人工势场法在自动驾驶避障中的实践与优化

本文深入探讨了人工势场法在自动驾驶避障中的核心原理与实践优化。通过解析引力与斥力模型,揭示了经典算法在局部最优和目标不可达等问题上的局限性,并重点介绍了改进斥力场函数、引入道路边界斥力及动态参数调整等关键优化策略,有效提升了该局部路径规划算法在复杂动态场景下的实用性与鲁棒性。

weixin_29208327的博客 927

dfs——深度优先搜索 详解

深度优先搜索,又称dfs,是一种图的搜索方法。算法的基本思想是:从图的某一个节点出发,沿着某一条路径一直往下搜索,直至该条路径的所有节点均被访问,则向上回溯,寻找没有被访问的节点。这个算法的思想有点类似于我们之前学过的暴力求解法,即枚举问题的所有可能的情况,对每一种情况进行讨论,然后找到符合问题的解。思维量小,不需要费脑筋。也不挑题型,几乎所有的题型均可用dfs(但是有些题并不适用dfs)。申明一下,可用和适用是两回事。时间复杂度较高,只适用于问题规模较小的问题。

qq_71450730的博客 2004

基于FPGA的图像预处理系统(图)

 北京机械工业学院 韩娟娟 邓文怡 娄小平 由于获取图像的工具或手段的影响,使获取图像无法完全体现原始图像的全部信息。因此,对图像进行预处理就显得非常重要。预处理的目的是改善图像数据,抑制不需要的变形或者增强某些对于后续处理来说比较重要的图像特征。通常根据预处理目的的不同,把预处理技术归为图像增强技术和图像分割技术两类。图像对比度处理是空间域图像增强的一种方法。由于图像灰度范围狭窄会使

lyzhangxianglove的专栏 1780

“暴力美学1”——DFS深度优先搜索

作为新时代青年,“暴力”二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 作为新时代青年,“暴力”二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词,但若是我们在后面加上美学二字,或许就是一个值得推敲的词汇了 喜欢篮球并且经常看NBA的朋友应该都知道NBA俩个暴力美学的代表,小皇帝“詹姆斯”和唐装“威少”。 他们二人完美阐述了暴力美学的概念,“观赏者本身往往惊叹于艺术化的表现形式,无法对内容产生具体的不舒适感。” 当我们把暴力美

Xuuuuuuuuuuu的博客 1732

ICM42670-P嵌入式开发实战:从寄存器配置到姿态解算全解析

本文全面解析ICM42670-P高性能6轴MEMS运动传感器的嵌入式开发实战,涵盖寄存器配置、数据采集滤波、低功耗优化及姿态解算算法。通过详细代码示例和应用案例,帮助开发者快速掌握从硬件对接到姿态跟踪系统的完整开发流程,适用于可穿戴设备和智能家居等低功耗应用场景。

gold的博客 1070

用ESP32-S3+OV2640摄像头+ILI9488屏,DIY一个能联网的智能猫眼(附完整代码)

本文详细介绍了如何利用ESP32-S3微控制器搭配OV2640摄像头和ILI9488显示屏,DIY一个功能强大的智能猫眼系统。从硬件选型、电路设计到软件开发,提供了完整的解决方案和优化技巧,包括图像采集显示、WiFi远程访问及低功耗设计,适合智能家居爱好者动手实践。

weixin_30897233的博客 501

【蓝桥杯C/C++】专题五:DFS深度优先搜索

本专题将讲解算法竞赛中最常用的算法dfs深度优先搜索,也叫回溯搜索法或者“暴力搜索”法,也就是说在比赛的时候就算遇到没有思路的题,也可以用递归实现暴力搜索来骗分。有的同学可能会过多的去纠结一些概念,比如递归、暴力搜索、回溯法、dfs等,其实我们大可不必去纠结,因为dfs和回溯搜索法本身就是一个算法,是用递归操作来实现的,而“暴力搜索”则是民间赋予的称号!!以下内容,我统称为回溯法(我最喜欢的名字)!回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯的本质是穷举。

程序员小火龙的知识分享 2926

Coursera | 离散数学概论(北大)| quiz答案

Coursera离散数学概论quiz答案Week1:数理逻辑:基本概念Week2:数理逻辑:命题逻辑及形式系统Week3:数理逻辑:谓词逻辑及形式系统Week4:集合论:集合代数   先放下Coursera上找的离散数学部分相关课程:   btw.线上学习拿证书还有很多,MOOC、edm等都可。   博主选了北京大学离散数学概论Discrete Mathematics Generality。Mooc上貌似也有,但是上课时间貌似不如Coursera灵活,Coursera时间自己调度,规定时间上完即可。目前课

小鱼干的博客 4128

【基础知识】一文看懂深度优先算法和广度优先算法

先上个图现在我们要访问图中的每个节点,即图的遍历。图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。我们根据访问节点的顺序与方式(根据搜索方法),可以分为广度优先(BFS)和深度优先(DFS),这是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等。我们分别来介绍。

fumeidonga的博客 1万+

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 685

Codex 接入国产大模型完整指南:CC-Switch 与 Codex++ 的工程化选型

Codex 默认走 OpenAI Responses API,而 DeepSeek、GLM、Kimi 等国产模型只提供 OpenAI-compatible 的 Chat Completions——两套协议在消息结构、流式响应、reasoning 字段、tool call 上都不兼容,所以"改个 Base URL + 填国产 Key"这种朴素操作根本跑不通。本文从架构师视角出发,把 Codex 接入国产大模型这件事讲透:先剖析协议链路到底卡在哪,再对比 CC-Switch和 Codex++两套主流方案的差异

少说,多做 3861

【算法入门】最短时间学会DFS深度优先搜索

深度优先搜索前言 - -DFS经典放牌组合,同学们肯定或多或少的听到过别人提起过DFS,BFS,却一直都不太了解是什么,其实两个各为搜索算法,常见使用 深度优先搜索(DFS) 以及 广度优先搜索(BFS) ,今天我们就来讲讲什么是深度优先搜索,深度优先用粗俗的话说就是撞到了南墙才知道回头,才会往上一层返回。

jhao的博客 1619

【WRF-Chem Emissions教程第一期】WRF-Chem 排放概述

WRF-Chem 排放概述

WW、forever的博客 852

【数据结构与算法】深度优先搜索(DFS)

对于考研人来说,BFS和DFS指的是图的两种遍历算法。但是严格意义上说,BFS和DFS是两种搜索策略。BFS代表算法在执行时,会像树的层次遍历那样,从属于同一个结点的后继的访问顺序相邻。DFS代表算法在执行时,会像树的先序遍历那样,沿着某条路径走到终点,再返回走另外一条路径。

DreamSuif的博客 1369

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

四阶数独——深度优先搜索dfs

四阶数独——深度优先搜索dfs

m0_46183615的博客 1151

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【蓝桥杯Java组】用Java带你暴走迷宫—DFS深度优先搜索

带你用Java+DFS深度优先搜索一次性走遍三道迷宫类问题,还不快来点开看看~ 题目 链接 迷宫(一) https://nanti.jisuanke.com/t/T1595 迷宫(二) http://nanti.jisuanke.com/t.

Keep coding! 3346

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 单调队列优化多重背包问题
算法小cai_
博客等级 码龄3年 33粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值