1. 深度优先搜索(DFS)是搜索手段之一。是从某个状态开始不断转移状态直到无法转移为止,然后退回到前一步状态继续转移其他状态,可以想象为一个沿树爬行的虫子,在一个交叉口他会首先随机选择一条分岔路口一直走下去直到死路为止,然后会返回到这个交叉口沿着另一条分支爬行下去,直到遍历所有可能的路径为止。根据这个特点,DFS算法用递归来实现比较简单。

以下例题说明

  • Lake Counting(POJ)
    有一个大小为N*M的园子,雨后积水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对W的A部分)
    AAA
    AWA
    AAA
    样例输入N=10,M=12,园子如下:
    w … … . . ww .
    . www … . . www
    … . ww … ww .
    … … … ww .
    … … … w . .
    . . w … … w . .
    . w . w … . . ww .
    w . w . w … . . w .
    . w . w … … w .
    . . w … … . w .
    输出 3

    • 解析:从任意w开始,不停把邻接部分用’.’代替。一次DFS后与初始的这个w连接的所有w就都被替换成了’.’,因此直到图中不再存在w为止,总共进行DFS的次数就是答案了。八个方向共对应了8种状态转移,每个格子DFS参数至多被调用一次。
    • 以下是部分答案片段,没写输入输出流以及主函数,但是主要功能函数在下面
#include <iostream>
#include <cstdio>
using namespace std;//输入
int N,M;
char field[MAX_N][MAX_M + 1]; // 园子void dfs (int x,int y)  //现在位置(x,y)
{field[x][y] = '.';   //将现在位置替换为‘.’for(int dx = -1; dx <= 1; dx++)  //循环遍历移动的8个方向{for(int dy = -1; dy <= 1; dy++){int nx = x + dx,ny = y + dy;  //向x方向移动dx,向y方向移动dy,移动结果为(nx,ny)if( 0 <= nx && nx <=N && 0 <=ny && ny <=M && field[nx][ny] == 'w')        //判断点是不是在院子内以及是否有积水dfs(nx, ny);}}return;
}
void solve()
{int res = 0;for(int i = 0; i < N; i++){for(int j = 0; j < M; j++){if (field[i][j] == 'w'){dfs(i, j);   // 从有w的地方开始dfsres++;}}}printf("%d\n", res);
}

详解ACM基础算法—DFS深度优先搜索算法 HIT杨朔相关推荐

  1. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 阅读本文前,请确保你已经掌握了递归.栈和队列的基本知识,如想掌握搜索的代码实现,请确保你能够用代码实现栈和队列的基本操作. 深度优先遍 ...

  2. Acwing 第一章模板及详解(基础算法)

    一.排序 二.二分 三.高精度 四.前缀和与差分 五.位运算 六.双指针算法 七.离散化 八.区间合并 一.排序 (一)快速排序算法: 由冒泡排序改进,在冒泡排序过程中,只对相邻的两个记录进行比较,每 ...

  3. 算法导论:dfs深度优先搜索算法及基于dfs的拓扑排序以及宽度优先搜索算法bfs

    1.dfs深度优先搜索算法 算法导论中是通过三种标记颜色来介绍dfs的,white代表还没被搜过,grey代表被搜了一些,还没结束,white表示已经搜索完成的状态. c/c++复现dfs代码 #in ...

  4. 暑期集训2:ACM基础算法 例1:POJ-1064

    2018学校暑期集训第二天--ACM基础算法 例一  --  POJ - 1064 Cable master Inhabitants of the Wonderland have decided to ...

  5. 【算法知识】详解希尔排序算法

    前言 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 当待插入元素是一个很小(当需求是从小到大排序时,从大到小排序时此处为很大)直接插入排序需要移动 ...

  6. 【算法知识】详解直接插入排序算法

    前言 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 在玩扑克牌的时候,我们抽到一张牌的时候,都是将它插入到当前手中牌的合适位置的. 如下图: (上图来自算法导论) 直接插入排序 ...

  7. 完全手册-MATLAB使用详解:基础、开发及工程应用

    [书名]完全手册-MATLAB使用详解:基础.开发及工程应用 [作者]董霖 编著 [ISBN]978-7-121-07397-7 [出版社]电子工业出版社 [出版日期]2009年1月 [内容简介] M ...

  8. Java方法详解(基础)

    Java方法详解(基础) 什么是方法? System.out.println():调用系统类标准输出对象方法out. 方法是语句的集合,他们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合. ...

  9. 【YBT高效进阶】1基础算法/4深度优先搜索/2数独游戏

    [YBT高效进阶]1基础算法/4深度优先搜索/2数独游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 数独是一种传统益智游戏,你需要 ...

最新文章

  1. 深入理解pandas读取excel,txt,csv文件等命令
  2. pycharm 如何通过VCS快速提交代码?
  3. AOP概述及实现原理
  4. 雷林鹏分享:codeigniter框架文件上传处理
  5. 只看影子就能还原视频,MIT新算法让摄像头无死角
  6. java值类型和引用类型的区别
  7. 命令查询每个文件文件数
  8. atitit.网络文件访问协议.unc smb nfs ftp http的区别
  9. linux运行海康,海康摄像头SDK在Linux、windows下的兼容问题(二)已解决
  10. 码农枪击了 4 名同事后被警方击毙!后附“程序员保命指南”
  11. Spring Securiy +aouth2.0+jwt整合,实现鉴权登录
  12. 直播提醒|今晚八点半,最硬核情感分析技术讲解来袭!内附SKEP详解+大作业指导!...
  13. pwntcha库的安装依赖
  14. 用mqtt客户端发数据到 thingsboard Error: Connection refused: Not authorized
  15. 水果 hdu 1263 模拟
  16. mysql几种性能测试的工具使用
  17. ffmpeg将图片合成视频
  18. Design with the User in Mind--从用户角度进行设计
  19. IP-guard助力防御incaseformat蠕虫病毒
  20. Android开发笔记(序)写在前面的目录大全

热门文章

  1. cesium中的billboard加载在线图片报错Tainted canvases may not be loaded
  2. 微信网页提示已停止访问的原因及解决方案
  3. DPDK rte_eal_init 初始化分析(根据最新的更新)
  4. Java 实现用户注册登陆
  5. 《唐探3》口碑急转直下?看看影迷们到底都说了些啥
  6. C基础 函数的形式参数和实际参数
  7. 安卓应用提供64位原生的支持
  8. 乖离水机器人攻略_乖离性百万亚瑟王风机器人攻略及卡组推荐
  9. office2007不能保存问题解决
  10. 百度网址html5,新网站如何让百度快速收录