<<算法很美>>——(七)——DFS典题(一):水洼数目
目录
问题描述
问题分析
放码过来
问题描述
有一个大小为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典题(一):水洼数目相关推荐
- <<算法很美>>——(七)——DFS典题(二):数独游戏
目录 问题描述 问题分析 放码过来: 问题描述 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数 ...
- 蓝桥杯算法很美笔记—排序实现题
题1:小白上楼梯(递归设计) 小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式. 思路: 一次可以上1阶,2阶或者3阶,则最后一步可以为上 ...
- 【算法很美】深入递归 (下)深度优先搜索DFS问题
深搜.回溯.剪枝 深度优先搜索DFS 2.1 无死角搜索I 数独游戏 部分和 水洼数目 2.2 回溯和剪枝 n皇后问题 素数环 困难的串 小结 一些使用 2.1 无死角搜索I 数独游戏 你一定听说过& ...
- 算法很美——数学问题
算法很美--数学问题 题1:天平称重 问题描述: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 砝码重量分别是1,3,9,27,81--3的指数次幂,每种重量砝码只有一个 则它们可以 ...
- 算法很美-位运算-找出落单的那个数
上级目录:算法很美 1. 题目 一个数组里除了某一个数字之外,其他的数字都出现了两次.请写程序找出这个只出现一次的数字. 2. 异或思路 异或的运算是A ^ A=0,也就是说偶数个相同的元素异或,结果 ...
- 【C++】利用DFS求解水洼数目问题
题目描述 有一个大小为N x M的园子,雨后积了很多水. 八连通的积水被认为是连接在一起的.(八连通指的是下图中相对.的W部分) 请求出园子里总共有多少个水洼? 八连通的水洼如下所示: W W W W ...
- 【DFS 水洼数目】
DFS 水洼数目 题目描述 代码 题目描述 题目: 有一个大小为 N*M 的园子,雨后积起了水.八连通的积水被认为是连接在一起的.请求出 园子里总共有多少水洼?(八连通指的是下图中相对 W 的.的部分 ...
- 水洼数目(dfs万能模板)
水洼数目(dfs万能模板) /* 有一个大小为 N×M 的园子,雨后积起了水.八连通的积水被认为是连接在一起的. 请求出 园子里总共有多少水洼?(八连通指的是下图中相对 W 的*的部分) W 限制条件 ...
- 算法很美:水洼数(dfs)深搜
题目描述 Descriptions: 由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= 100; 1 <= M <= 1 ...
最新文章
- 在Data Collector中使用TensorFlow进行实时机器学习
- 论字符界面和WEB界面配置的优缺点
- python买什么书好-Python入门经典书籍有哪些?有这三本就够了
- Intellij IDEA调试
- java公平索非公平锁_java中的非公平锁不怕有的线程一直得不到执行吗
- live555源代码简介
- mysql hex 和 c_什么是MySQL HEX()函数,它与CONV()函数有何不同?
- 使用TortoiseSVN下载SourceForge.net上的代码
- oracle 10g inctype参数使用,ORACLE 10G 重要命令及参数详解
- 测试 REST API,到底应该选择什么样的 VS Code 插件?
- order by case when then end
- java.lang.Integer常用方法
- python编程求长方形的面积_Python实现计算长方形面积(带参数函数demo)
- 买房贷款,“房贷20年”和“房贷30年”,哪个更划算?为什么?
- 计算机没有休眠睡眠状态,电脑没有睡眠模式_电脑怎么没有睡眠模式
- jasperprint 设置横向打印
- python输入一个英文句子_Python给定一个句子倒序输出单词以及字母的方法
- nsis安装包(三)_NSIS简介
- 如何引用电影?(APA、MLA、芝加哥、温哥华格式)
- 五边形顶点坐标_任意给定五边形的5个顶点坐标,利用多边形填充的扫描算法,编写程序生成一个实心五边形...
热门文章
- matlab app designer学习笔记1——简易计算器
- linux同步两台mysql数据,Mysql入门MySQL 数据库两台主机同步实战(linux)
- linux文件回收站恢复,Linux之恢复误删的文件[针对丢弃到回收站]
- 卧龙图甄选 | 惊蛰来到,万物复苏,春天的气息扑面而来
- 2023前端vue高频面试题
- php正则表达式后向引用和贪婪模式
- easypoi一对多导入_easypoi导入Excel最佳实践
- json字符串转换成list对象
- UE4 射击类游戏 手机端视角随触摸改变方法
- 禁止html5手机端双击页面放大的问题,主要针对苹果手机