【DFS练习】水洼数

简介: 【DFS练习】水洼数

问题描述:

水洼数目有一个大小为N * M的院子,雨后积起了水,

八连通的积水被认为是连在一起的,请求出园子里面总共有多少水洼

限制条件

N, M <=100

测试集在代码后面

总体思路:

  • 一个水洼一定是一个或多个W连接在一起的,所以可以先找到第一个W,然后看与这个W相连接的其他W,当他的周围没有W只有.的时候,就检查完了一个水洼
  • 由于检查过的积水不能第二次被计算,所以一个巧妙的方法就是检查之后把他变成点(路过之处寸草不生)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
// 剪枝:递归之前做限定
const int maxn = 20;
int n, m, cnt = 0;
char a[maxn][maxn];
void dfs(int i, int j){
  a[i][j] = '.';
  for(int k = -1; k < 2; k++){    //-1,0,1分别代表横坐标向左,不动,向右
    for(int l = -1; l < 2; l++){  //纵坐标
      if(k == 0 && l == 0) continue;//扣去x和y都不动的情况
      if(i+k <= n-1 && i+k >= 0 && j+l <= m-1 && j+l >= 0){//检查x和y动了之后是否越界
        if(a[i+k][j+l] == 'W'){//如果是一个水洼,继续深搜
          dfs(i+k, j+l);
        }
      }
    }
  }
}
int main(){
  cin >> n >> m;
  for(int i = 0; i < n; i++){
    string s;
    cin >> s;
    for(int j = 0; j < m; j++){
      a[i][j] = s[j];
    }
  }
  for(int i = 0; i< n; i++){
    for(int j = 0; j < m; j++){
      if(a[i][j] == 'W'){
        dfs(i,j);
        cnt++;
      }
    }
  }
  cout << cnt << endl;
  return 0;
}
/*
测试集:
..W.....WW
.W......W.
WW.....WW.
........W.
....WW..WW
....W...W.
...W.W....
..W...W...
...W.W....
....W.....
答案: 3 
*/
相关文章
LVM 缩减 / 根目录导致的开机错误
LVM 缩减 / 根目录导致的开机错误
525 0
|
NoSQL Redis
若依管理系统去掉Redis相关配置
若依管理系统去掉Redis相关配置
|
存储 机器学习/深度学习 人工智能
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
|
SQL 分布式计算 运维
如何优化超长定时任务:慢节点优化实践
本文介绍了一个复杂的ODPS任务优化过程。通过对任务耗时卡点的分析,发现主要问题是数据倾斜和join任务资源不足。通过提高join任务资源分配、对空值加随机值打散、视图物化落表、节点拆分、前置裁剪和使用Distributed Mapjoin等方法,成功将宽表产出时间从下午一点提前到早上八点半,节省了4小时以上。优化过程中还拆分了宽表节点,降低了回刷成本。文章强调了在设计开发初期应避免代码耦合度过高,以提高代码运行效率和可维护性。
285 0
|
缓存 运维 监控
PostgreSQL运维技巧之vacuum调优
PostgreSQL运维技巧之vacuum调优
1276 3
|
Windows
【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 | 绘制点模式 )(二)
【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 | 绘制点模式 )(二)
462 0
【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 | 绘制点模式 )(二)
|
机器学习/深度学习 数据采集 数据可视化
【机器学习】样本、特征、标签:构建智能模型的三大基石
【机器学习】样本、特征、标签:构建智能模型的三大基石
6049 0
|
机器学习/深度学习 编解码
UNet介绍及其相关思考
UNet介绍及其相关思考
|
Java Linux Android开发
eclipse的jar包在Linux中报错
eclipse的jar包在Linux中报错
eclipse的jar包在Linux中报错
|
前端开发 JavaScript
如何优雅地使用Vue3的异步组件
在开发Vue项目时,大多数人都会用到组件。在父组件中,子组件的加载一般是按照先后顺序加载的,子组件加载后才会加载父组件。如果一个页面的子组件很多,由于会先加载子组件,那么父组件可能会出现比较长的白屏等待时间。我们想让`child.vue`组件异步加载应该怎么办呢?Vue3
1492 1
如何优雅地使用Vue3的异步组件