2520: 【普及-】【P1596】Lake Counting S

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:12 解决:6

题目描述

由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 lns="http://www.w3.org/1998/Math/MathML">×(1100,1100) 的网格图表示。每个网格中有水(W) 或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。


输入

输入第 lns="http://www.w3.org/1998/Math/MathML">1 行:两个空格隔开的整数:lns="http://www.w3.org/1998/Math/MathML"> 和 lns="http://www.w3.org/1998/Math/MathML">

第 lns="http://www.w3.org/1998/Math/MathML">2 行到第 lns="http://www.w3.org/1998/Math/MathML">+1 行:每行 lns="http://www.w3.org/1998/Math/MathML"> 个字符,每个字符是 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

提示

#include<bits/stdc++.h>
using namespace std;
struct point{
	int x,y;
};
int n,m,ans=0,dx[8]={0,-1,-1,-1,0,1,1,1},dy[8]={-1,-1,0,1,1,1,0,-1};
char land[105][105];
bool mark[105][105]={0};
queue<point> q;
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			cin>>land[i][j];
		}
	}
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			if(land[i][j]=='W'&&mark[i][j]==0) {
				ans++;
				mark[i][j]=1;
				//bfs
				q.push(point{i,j});
				while(!q.empty()) {
					point p=q.front();
					q.pop();
					for(int k=0;k<8;k++) {
						int x=p.x+dx[k],y=p.y+dy[k];
						if (x<0||y<0) continue;
						if (land[x][y]=='W'&&mark[x][y]==0) {
							mark[x][y]=1;
							q.push(point{x,y});
						}
					}
				}
			}
		}
	}
	cout<<ans;
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0,dx[8]={0,-1,-1,-1,0,1,1,1},dy[8]={-1,-1,0,1,1,1,0,-1};
char land[105][105];
bool mark[105][105]={0};
void dfs(int x,int y) {
	for(int i=0;i<8;i++) {
		int tx=x+dx[i],ty=y+dy[i];
		if(land[tx][ty]=='W'&&mark[tx][ty]==0) {
			mark[tx][ty]=1;
			dfs(tx,ty);
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			cin>>land[i][j];
		}
	}
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			if(land[i][j]=='W'&&mark[i][j]==0) {
				ans++;
				mark[i][j]=1;
				dfs(i,j);
			}
		}
	}
	cout<<ans;
	return 0;
}