目录

问题描述

问题分析

放码过来


问题描述

有一个大小为N×MN×M N\times MN×M的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?八连通指的是下图中相对W的∗部分,‘W’表示积水,’ * '表示没有积水。

∗∗∗
∗W∗
∗∗∗

输入样例

10 12
W********WW*
*WWW*****WWW
****WW***WW*
*********WW*
*********W**
**W******W**
*W*W*****WW*
W*W*W*****W*
*W*W******W*
**W*******W*

输出样例

3

问题分析

假如这个红色的地方有水,首先以它为中心,进行找,找到了就以新的为中心继续往下找

但这样会出现一个问题,就是它会往回走,这样就会陷入死循环,怎么样才能避免这样的事情发生囊?大家先思考下,这里留个悬念下面讲

继续往前走,发现前面没有积水了,它开始找另外方向有没有积水,发现没有后,就会退到上一层,继续寻找其他方向有没有积水,没有继续往回退,直到退到第一个积水的八个方向都走完,这样就完成了。

ok,我们开始思考怎么样才能避免它往回走陷入死循环的情况囊?

只要我们走到的位置有积水,走过后我们就把积水抽掉,让它变的干燥,就是上面例子中给的当走到的地方有积水也就是'W‘走过后把它变成'*’,这样遍历完后他都变成‘*'了也就结束了,避免了死循环.

这道题很经典,这种思想可以说在深搜中屡试不爽,所以我们可以把这个当做例题模板,背下来,遇到类似的题,像迷宫,岛屿之类的可以直接套模板。

话不多说,

放码过来

#include<iostream>
#include<cstring>
using namespace std;
int cnts;
//n是行,m是列
int n, m;
void dfs(string* a, int i, int j)
{//a[i][j] = '.';//if (i > 0 && a[i - 1][j] == 'W')dfs(a, i - 1, j);//上方//if (i <n-1&& a[i + 1][j] == 'W')dfs(a, i + 1, j);//下方//if (j > 0 && a[i][j - 1] == 'W')dfs(a, i, j - 1);//左//if (j < m - 1 && a[i][j + 1] == 'W')dfs(a, i, j + 1);//右//.....a[i][j] = '.';for (int k = -1; k < 2; k++)//-1,0,1{for (int l = -1; l < 2; l++)//-1,0,1{if (k == 0 && l == 0)continue;if (i + k >= 0 && i + k <= n - 1 && j + l >= 0 && j + 1 <= m - 1){if (a[i + k][j + l] == 'W'){dfs(a, i + k, j + l);}}}}
}
int main()
{cin >> n >> m;string* a=new string[n];for (int i = 0; i < n; i++){cin >> a[i];}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (a[i][j] == 'W'){dfs(a,i,j);cnts++;}}}cout << cnts << endl;return 0;
}

我们再回来看下这个题目:

我们使用双重for循环,来遍历这个二维数组,首先发现第一组的'W’就DFS遍历,遇到'W‘就继续往下走,直到把第一组的所有'W’都变为'.',就返回,这时第一个水洼就遍历完了,cnts对应加1,继续进行for循环找下一组'W‘的位置,如上图的2和3.重复1的操作,直到把所有的'W’遍历为'.‘这样for循环也就结束了.cnts此时的数就是水洼数。

这里我们思考一个问题,这里可以回溯嘛?答案肯定是不可以的,因为当我们遍历并把其改为'.’再进行回溯又变成了'W‘这样来来回回根本统计不完,所以回溯的使用要根据每个题目的不同进行灵活判断。

<<算法很美>>——(七)——DFS典题(一):水洼数目相关推荐

  1. <<算法很美>>——(七)——DFS典题(二):数独游戏

    目录 问题描述 问题分析 放码过来: 问题描述 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数 ...

  2. 蓝桥杯算法很美笔记—排序实现题

    题1:小白上楼梯(递归设计) 小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式. 思路: 一次可以上1阶,2阶或者3阶,则最后一步可以为上 ...

  3. 【算法很美】深入递归 (下)深度优先搜索DFS问题

    深搜.回溯.剪枝 深度优先搜索DFS 2.1 无死角搜索I 数独游戏 部分和 水洼数目 2.2 回溯和剪枝 n皇后问题 素数环 困难的串 小结 一些使用 2.1 无死角搜索I 数独游戏 你一定听说过& ...

  4. 算法很美——数学问题

    算法很美--数学问题 题1:天平称重 问题描述: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 砝码重量分别是1,3,9,27,81--3的指数次幂,每种重量砝码只有一个 则它们可以 ...

  5. 算法很美-位运算-找出落单的那个数

    上级目录:算法很美 1. 题目 一个数组里除了某一个数字之外,其他的数字都出现了两次.请写程序找出这个只出现一次的数字. 2. 异或思路 异或的运算是A ^ A=0,也就是说偶数个相同的元素异或,结果 ...

  6. 【C++】利用DFS求解水洼数目问题

    题目描述 有一个大小为N x M的园子,雨后积了很多水. 八连通的积水被认为是连接在一起的.(八连通指的是下图中相对.的W部分) 请求出园子里总共有多少个水洼? 八连通的水洼如下所示: W W W W ...

  7. 【DFS 水洼数目】

    DFS 水洼数目 题目描述 代码 题目描述 题目: 有一个大小为 N*M 的园子,雨后积起了水.八连通的积水被认为是连接在一起的.请求出 园子里总共有多少水洼?(八连通指的是下图中相对 W 的.的部分 ...

  8. 水洼数目(dfs万能模板)

    水洼数目(dfs万能模板) /* 有一个大小为 N×M 的园子,雨后积起了水.八连通的积水被认为是连接在一起的. 请求出 园子里总共有多少水洼?(八连通指的是下图中相对 W 的*的部分) W 限制条件 ...

  9. 算法很美:水洼数(dfs)深搜

    题目描述 Descriptions: 由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= 100; 1 <= M <= 1 ...

最新文章

  1. 在Data Collector中使用TensorFlow进行实时机器学习
  2. 论字符界面和WEB界面配置的优缺点
  3. python买什么书好-Python入门经典书籍有哪些?有这三本就够了
  4. Intellij IDEA调试
  5. java公平索非公平锁_java中的非公平锁不怕有的线程一直得不到执行吗
  6. live555源代码简介
  7. mysql hex 和 c_什么是MySQL HEX()函数,它与CONV()函数有何不同?
  8. 使用TortoiseSVN下载SourceForge.net上的代码
  9. oracle 10g inctype参数使用,ORACLE 10G 重要命令及参数详解
  10. 测试 REST API,到底应该选择什么样的 VS Code 插件?
  11. order by case when then end
  12. java.lang.Integer常用方法
  13. python编程求长方形的面积_Python实现计算长方形面积(带参数函数demo)
  14. 买房贷款,“房贷20年”和“房贷30年”,哪个更划算?为什么?
  15. 计算机没有休眠睡眠状态,电脑没有睡眠模式_电脑怎么没有睡眠模式
  16. jasperprint 设置横向打印
  17. python输入一个英文句子_Python给定一个句子倒序输出单词以及字母的方法
  18. nsis安装包(三)_NSIS简介
  19. 如何引用电影?(APA、MLA、芝加哥、温哥华格式)
  20. 五边形顶点坐标_任意给定五边形的5个顶点坐标,利用多边形填充的扫描算法,编写程序生成一个实心五边形...

热门文章

  1. matlab app designer学习笔记1——简易计算器
  2. linux同步两台mysql数据,Mysql入门MySQL 数据库两台主机同步实战(linux)
  3. linux文件回收站恢复,Linux之恢复误删的文件[针对丢弃到回收站]
  4. 卧龙图甄选 | 惊蛰来到,万物复苏,春天的气息扑面而来
  5. 2023前端vue高频面试题
  6. php正则表达式后向引用和贪婪模式
  7. easypoi一对多导入_easypoi导入Excel最佳实践
  8. json字符串转换成list对象
  9. UE4 射击类游戏 手机端视角随触摸改变方法
  10. 禁止html5手机端双击页面放大的问题,主要针对苹果手机