1. 问题描述:

水洼数目有一个大小为N * M的院子,雨后积起了水,
八连通的积水被认为是连在一起的,请求出园子里面总共有多少水洼(八连通指的是下图中相对w大的*部分)
***
*w*
***
限制条件
N, M <=100
样例:
输入
N = 10, M = 12

园子如下图('W'表示积水,'.'表示没有积水)

输出3

2. 问题是要我们求解出连着的一片的水洼的数量,对于这类经典的问题,使用其它迭代等的方法是难以求解的,因为我们不知道连着的积水的区域有多少,对于这类问题的求解,我们是采用常用的无死角搜索的深度优先搜索dfs算法来解决,因为dfs能够帮助我们搜索出所有的可能,尝试去走每一条路线,直到所有的路线都被走完了,那么dfs久终止了

基于上面的分析,我们知道要使用dfs来求解,但是我们具体怎么样做呢,这里假如从数组的起始位置开始上往下搜索,那么上一个状从该数组的这个位置的八个方向开始搜索,上一个状态结束之后,那么进入到下一个状态,但是进入到下一个状态的时候它也会往自己的八个方向开始搜索,下一个状态又会搜索至上一个状态的地方,而上一个状态又会往下一个状态搜索,这就造成了递归无法出去了,永远得不到答案而且会导致栈溢出,所以我们该如何避免这种情况呢,其中比较有技巧的方法是当发现这个位置有积水之后把这个位置变为干燥,即将字符'W'变为'.',这样转移到下一个状态的时候那么往八个方向搜索的时候就不会走之前有积水的地方,因为之前有积水的地方已经干燥了,这样问题就可以解决了,当一个dfs搜索完之后那么它周围的积水都被清除掉了,那么继续寻找下一个有积水的地方然后进行dfs,当所有的积水区域都被赶走之后那么水洼的数量就计算出来了

其中涉及到搜索以自己为中心的八个方向的搜索,所以存在着八个平行状态的搜索,这里使用到了一个技巧就是使用两层的for循环来进行处理

总结一下:比较核心的问题是如何避免在下一个状态进入到上一个状态的时候进入循环的递归,那么这个时候就要将上一次的结果清除掉,这样就不会陷入到无限递归的情况

3. 具体的代码如下:

import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();int count = 0;char arr[][] = new char[m][n];for(int i = 0; i < m; i++){arr[i] = sc.next().toCharArray();}for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){//有'W'的地方说明有积水if(arr[i][j] == 'W'){dfs(arr, i, j);
//                  System.out.println(i + " " + j);count++;}}}System.out.println(count);sc.close();}private static void dfs(char[][] arr, int i, int j) {arr[i][j] = '.';//搜索八个平行状态然后看一下连通的水洼//因为涉及到八个平行状态那么可以使用for循环,但是我们可以使用嵌套两个for循环的技巧来进行处理//因为加的都是-1 0 1 而1而且左上角到右下角//行的长度: arr.length 列的长度: arr[0].lengthfor(int k = -1; k <= 1; k++){for(int l = -1; l <= 1; l++){if(k == 0 && l == 0) continue;if(i + k >=0 && j + l<= arr[0].length - 1 && i + k <= arr.length - 1 && j + l >=0){if(arr[i + k][j + l] == 'W'){//继续搜寻它的下一个积水dfs(arr, i + k, j + l);}}}} }
}

深度优先搜索之水洼的数量相关推荐

  1. 算法学习--水洼的数量

    深度优先搜索之水洼的数量 原创 蠕动的二哈 最后发布于2018-10-26 17:33:14 阅读数 379 收藏 展开 问题描述: 水洼数目有一个大小为N * M的院子,雨后积起了水, 八连通的积水 ...

  2. C语言水洼数算法,C++ 数据结构之水洼的数量算法

    C++ 数据结构之水洼的数量算法 题目: 有一个大小为N*M的园子, 雨后起了积水. 八连通的积水被认为是连接在一起的. 请求出园子里总共有多少水洼. 使用深度优先搜索(DFS), 在某一处水洼, 从 ...

  3. C语言水洼数算法,水洼的数量算法 代码(C)

    题目: 有一个大小为N*M的园子, 雨后起了积水. 八连通的积水被认为是连接在一起的. 请求出园子里总共有多少水洼. 使用深度优先搜索(DFS), 在某一处水洼, 从8个方向查找, 直到找到所有连通的 ...

  4. 深度优先搜索的例子以及分析

    1. 问题描述: 深度优先搜索特别适用于那些探索所有的可能性的这些问题,问题解决的可能性是非常多的,所以需要去探索所有的可能性,从而找到所有能够满足问题的解决方案或者是解决方案中最优的那一个,下面是使 ...

  5. 【C++】DFS——计算土地上水洼的数量

    题目大意:一场大雨后,在一片土地上出现若干水洼,现在把这片土地看成一个mxn的二维方块矩阵,其中有水的方块用'W'表示,陆地用'H'表示.现在由陆地方块或者边界围成的有水方块视为一个水洼(单个有水方块 ...

  6. C语言递归解决水洼问题

    解析: 水洼问题的一个解法就是先找到一个水坑,将它清零,然后遍历它周围将所有水坑清零,直到将这个水洼整体清零,水洼数加一,一直循环直到将所有水洼都清零,其中要注意的一个点就是避免过界. /*水洼问题假 ...

  7. 深度搜索—-深度搜索解决矩阵搜索问题(水洼数计算)

    深度搜索--深度搜索解决矩阵搜索问题(水洼数计算) 一.题目 有一个大小为N*M的园子,雨后积起了水.八连通的计税被认为是连接在一起的.请求出园子里总共有多少水洼? (八连通指的是下图中相对w的*的部 ...

  8. 2018-2-22 《啊哈,算法》再练习广度优先搜索,题:炸怪兽, 2-23改用深度优先搜索。宝岛探险(广度,深度,及地图着色)2-24水管工游戏,2-25测试水管工代码...

    2小时. 先是是纠错,通过对代码运行过程的测试.发现是变量打错.以及录入地图❌. 重构练习题,改使用while..end代替for in. ⚠️ : 在while(k <= n)中如果用到nex ...

  9. 【LeetCode 深度优先搜索专项】不同岛屿的数量 II(711)

    文章目录 1. 题目 1.1 示例 1.2 说明 1.3 提示 1.4 进阶 2. 解法一(深度优先搜索) 2.1 分析 2.2 解答 2.3 复杂度 1. 题目 给定一个 m×nm \times n ...

最新文章

  1. Programming Pearls: Chatper3 Problem5 [Hyphenation Words]
  2. mysql语句将日期转换为时间戳的方法
  3. CSS3中的群组选择器,后代选择器[空格]子元素选择器 >相邻兄弟选择器+兄弟选择器~
  4. visual c 语言参考手册pdf,Microsoft-Visual-C-6-0语言参考手册(三).pdf
  5. CodeForces - 1300E Water Balance(贪心)
  6. poj 2251 Dungeon Master (三维bfs)
  7. sql server 2005技术大全_3年2.16~3.2万吨!上机数控子公司与新疆大全签订多晶硅采购长单...
  8. Flutter 即学即用系列博客——09 MethodChannel 实现原生与 Flutter 通信(二)
  9. Linux查看某个进程的启动时间
  10. SMTP 发送内嵌图片 邮件
  11. Selenium2_如何判断WebElement元素对象是否存在
  12. SCLK时钟信号可以高电平有效也可以低电平有效
  13. java tic tac toe_java – 对Tic Tac Toe的建议
  14. 性能测试模型之曲线拐点模型——压力曲线分析图
  15. linux sftp 重命名,SFTP对文件重命名 删除 退出 查看
  16. 应该用BPM管理业务规则吗?
  17. Arduino 学习思考与记录
  18. 【黄啊码】thinkphp sql wherein的排序问题|tp不能按whereIn排序?
  19. 【脚本项目源码】Python制作艺术签名生成器,打造专属你的个人艺术签名
  20. Java自学笔记——Java面向对象——04.抽象类、接口、内部类

热门文章

  1. matlab将三维图像合并
  2. Trace32 Simulator for ARM (Qualcomm dump analysis)
  3. 线性规划的典型例题:生产决策问题(思考+程序代码)
  4. 【求职杂谈】—阶段性求职总结
  5. 关于win7+ubuntu双系统安装过程
  6. 如何理解三大微分中值定理?
  7. 【项目】API接口的加签和验签
  8. html表单发送json,在HTML表单上发送JSON数据提交
  9. 一个Web系统的界面设计和开发.2
  10. 销售需求丨借贷记账法