NOI openjudge 1388:Lake Counting
题目翻译
由于最近的降雨,水在农民约翰的田地里的不同地方聚集起来,这片田地由一个长方形表示,长方形为N x M(1<=N<=100;1<=M<=100)正方形。每个广场都有水(“W”)或旱地(“.”)。农夫约翰想知道他的田地里形成了多少池塘。池塘是一组相互连接的广场,其中有水,其中一个广场被视为与其所有八个邻居相邻。
给农民约翰的田地一张图表,确定他有多少池塘。
输入
第1行:两个空格分隔的整数:N和M
第2行到N+1行:M个字符,代表一排农民约翰的田地。每个字符都是“W”或“.”字符之间没有空格。
输出
第1行:农夫约翰田里池塘的数量。
样例
输入
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
解题思路
数据上可以直接暴力搜索,每次找到一个 W 并且之前没有被标记过,那这一定是一个新的湖泊,然后我们想四周搜索,能连起来的都标记上,找不到了就推出搜索,接着找没被标记的 W。
代码示例
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int ans;
char s[101][101];
bool book[101][101];
void dfs(int x,int y){
if(s[x][y-1]=='W'&&book[x][y-1]==0&&y-1>=0){
book[x][y-1]=1;
dfs(x,y-1);
}
if(s[x-1][y]=='W'&&book[x-1][y]==0&&x-1>=1){
book[x-1][y]=1;
dfs(x-1,y);
}
if(s[x-1][y-1]=='W'&&book[x-1][y-1]==0&&x-1>=1&&y-1>=0){
book[x-1][y-1]=1;
dfs(x-1,y-1);
}
if(s[x][y+1]=='W'&&book[x][y+1]==0&&y+1<m){
book[x][y+1]=1;
dfs(x,y+1);
}
if(s[x+1][y]=='W'&&book[x+1][y]==0&&x+1<=n){
book[x+1][y]=1;
dfs(x+1,y);
}
if(s[x+1][y+1]=='W'&&book[x+1][y+1]==0&&x+1<=n&&y+1<m){
book[x+1][y+1]=1;
dfs(x+1,y+1);
}
if(s[x-1][y+1]=='W'&&book[x-1][y+1]==0&&x-1>=1&&y+1<m){
book[x-1][y+1]=1;
dfs(x-1,y+1);
}
if(s[x+1][y-1]=='W'&&book[x+1][y-1]==0&&x+1<=n&&y-1>=0){
book[x+1][y-1]=1;
dfs(x+1,y-1);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
if(book[i][j]==0&&s[i][j]=='W'){
ans++;
dfs(i,j);
}
}
}
cout<<ans<<endl;
return 0;
}