题目描述
农夫约翰有一片 N∗M 的矩形土地。
最近,由于降雨的原因,部分土地被水淹没了。
现在用一个字符矩阵来表示他的土地。
每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。
现在,约翰想知道他的土地中形成了多少片池塘。
每组相连的积水单元格集合可以看作是一片池塘。
每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。
请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。
输入格式
第一行包含两个整数 N 和 M。
接下来 N 行,每行包含 M 个字符,字符为”W”或”.”,用以表示矩形土地的积水状况,字符之间没有空格。
输出格式
输出一个整数,表示池塘数目。
数据范围
1≤N,M≤1000
样例
输入样例:
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
算法1
(bfs)
时间复杂度 不会算
参考文献
《算法提高课》
C++ 代码
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 1010;
int n,m;
char The_map[N][N];
PII q[N*N];
bool The_judge[N][N];
int bfs()
{
int sum = 0;
for(int i = 0 ; i < n ;i ++ )
for(int j = 0 ; j < m ; j ++ )
{
if(The_map[i][j] == 'W')
{
if(!The_judge[i][j])
{
int hh = 0, tt = -1;
q[++ tt ] = {i , j};
The_judge[i][j] = true;
while(hh <= tt)
{
PII t = q[hh++];
for(int ii = t.x - 1 ; ii <= t.x + 1 ; ii ++ )
for(int jj = t.y - 1; jj <= t.y + 1 ; jj ++ )
{
if(The_map[ii][jj] == '.')continue;
if(The_judge[ii][jj]) continue;
if(ii == t.x&&jj == t.y) continue;
if(ii < 0 || ii >= n || jj < 0 || jj >= m) continue;
q[++tt] = {ii,jj};
The_judge[ii][jj] = true;
}
}
sum ++;
}
}
}
return sum;
}
int main()
{
cin >> n >> m;
for(int i = 0 ; i < n ; i ++ )
cin >> The_map[i];
cout << bfs() << endl;
return 0;
}