题目链接:POJ 2386

Description

由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= 100; 1 <= M <= 100) 的正方形来表示。农场中的每个格子可以用'W'或者是'.'来分别代表积水或者土地,约翰想知道他的农场中有多少池塘。池塘的定义:一片相互连通的积水。任何一个正方形格子被认为和与它相邻的8个格子相连。

给你约翰农场的航拍图,确定有多少池塘

Input

* Line 1: N 和 M

* Lines 2..N+1: M个字符一行,每个字符代表约翰的农场的土地情况。每个字符中间不包含空格

Output

* Line 1: 池塘的数量

Sample Input

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

Sample Output

3

题意

池子是八连通的,问有多少池塘。

题解:

DFS水题中的水题,深搜,从碰到的第一个水格子开始,进入dfs函数,把这个点能到达的所有点都变成.,同时计数++。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>

using namespace std;

typedef long long ll;

const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 5;
//int dir[4][2] = { 1,0,0,1,-1,0,0,-1 };
char feld[110][110];
int n, m;
void dfs(int x, int y) {
    feld[x][y] = '.';
    int nx, ny;
    for(int i(-1);i<2;i++)
        for (int j(-1); j < 2; j++) {
            nx = x + i;
            ny = y + j;
            if (nx >= 0 && ny >= 0 && nx < n&&ny < m&&feld[nx][ny] == '@') {
                dfs(nx, ny);
            }
        }
}
int main() {
    int num;
    while (cin >> n >> m,n) {
        num = 0;
        memset(feld, 0, sizeof(feld));
        for (int i(0); i < n; i++) {
            cin >> feld[i];
        }
        for(int i(0);i<n;i++)
            for (int j(0); j < m; j++) {
                if (feld[i][j] == '@') {
                    dfs(i, j);
                    num++;
                }
            }
        cout << num << endl;
    }
}