【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 
*/
相关文章
|
3月前
|
算法
DFS算法的实现
DFS算法的实现
60 3
|
5月前
|
算法 索引
DFS算法及应用(二)
回溯:回溯就是DFS的一种,在搜索探索过程中寻找问题的解,当发现不满足求解条件时,就回溯返回,尝试其他路径。
|
5月前
|
算法
DFS算法及应用(一)
DFS(深度优先搜索)是一种图遍历算法,常用于解决穷举问题,如全排列、迷宫问题、图的连通性等。它沿着树的深度分支进行探索,直至达到叶子节点,若无法继续则回溯。例如,将数字6拆分为3个正整数的递增序列问题可以通过DFS实现,类似地,分糖果问题和买瓜问题同样可以用DFS求解。DFS通常涉及递归或栈结构,通过标记已访问节点避免重复。在编程中,会定义递归函数,设定结束条件,然后枚举可能的情况,并处理下一层节点。
|
C语言 C++
【DFS练习】素数环
【DFS练习】素数环
110 0
|
定位技术
DFS:迷宫解的方案数
DFS:迷宫解的方案数
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(dfs)
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(dfs)
124 0
|
算法
迭代加深(DFS)
复习acwing算法提高课的内容,本篇为讲解算法:迭代加深,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
140 0
迭代加深(DFS)
|
测试技术
7-37 整数分解为若干项之和 (20 分)(dfs)
7-37 整数分解为若干项之和 (20 分)(dfs)
256 0