题目描述
由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。
我们用一个 N x M 网格图表示,每个网格中有水 W
或是旱地 .
,
一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。
约翰想弄清楚他的田地已经形成了多少水坑,给出约翰田地的示意图,确定当中有多少水坑。
输入格式
第 1 行:两个空格隔开的整数:N 和 M
第 2 行 ~ 第 N+1 行:每行 M 个字符,每个字符是 W
或 .
,它们表示网格图中的一排,字符之间没有空格。
输出格式
一行:水坑的数量
输入样例
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
输出样例
3
样例解释
有三个池塘: 一个在左上角,一个在左下角,一个在右边。
题解一
DFS:
#include <iostream>
using namespace std;
const int N = 110;
int n, m;
char g[N][N];
bool st[N][N];
void dfs(int x, int y)
{
st[x][y] = true;
for (int i = -1; i <= 1; i ++)
for (int j = -1; j <= 1; j ++)
{
int a = x + i, b = y + j;
if(a < 1 || a > n || b < 1 || b > m) continue;
if(g[a][b] == '.' || st[a][b]) continue;
dfs(a, b);
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
cin >> g[i][j];
int ans = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if(g[i][j] == 'W' && !st[i][j])
{
ans ++;
dfs(i, j);
}
cout << ans << endl;
return 0;
}
题解二
BFS:
#include <iostream>
#include <queue>
#define x first
#define y second
using namespace std;
const int N = 110;
typedef pair<int, int> PII;
queue<PII> q;
int n, m;
char g[N][N];
bool st[N][N];
void bfs(int x, int y)
{
q.push(make_pair(x, y));
st[x][y] = true;
while(q.size())
{
PII t = q.front();
q.pop();
for (int i = -1; i <= 1; i ++)
for (int j = -1; j <= 1; j ++)
{
int a = t.x + i, b = t.y + j;
if(a < 1 || a > n || b < 1 || b > m) continue;
if(g[a][b] == '.' || st[a][b]) continue;
q.push(make_pair(a, b));
st[a][b] = true;
}
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
cin >> g[i][j];
int ans = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if(g[i][j] == 'W' && !st[i][j])
{
ans ++;
bfs(i, j);
}
cout << ans << endl;
return 0;
}