【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 
*/
相关文章
|
C语言 C++
【DFS练习】素数环
【DFS练习】素数环
119 0
|
定位技术
DFS:迷宫解的方案数
DFS:迷宫解的方案数
|
定位技术
DFS:踏青
DFS:踏青
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(dfs)
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(dfs)
126 0
|
算法
迭代加深(DFS)
复习acwing算法提高课的内容,本篇为讲解算法:迭代加深,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
154 0
迭代加深(DFS)
|
算法
正整数n不同分解式的个数(DFS)
正整数n不同分解式的个数(DFS)
223 0
|
测试技术
7-37 整数分解为若干项之和 (20 分)(dfs)
7-37 整数分解为若干项之和 (20 分)(dfs)
262 0