Due to recent rains, water has pooled in various places in Farmer John’s field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water (‘W’) or dry land (’.’). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.
Given a diagram of Farmer John’s field, determine how many ponds he has.
Line 1: Two space-separated integers: N and M
Lines 2…N+1: M characters per line representing one row of Farmer John’s field. Each character is either ‘W’ or ‘.’. The characters do not have spaces between them.
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
翻译:
描述由于最近的降雨,水汇集在Farmer John’s油田的不同地方,用N×M(1 <= N <= 100; 1 <= M <= 100)方格的矩形表示。 每个方块包含水(‘W’)或旱地(’。’)。 农夫约翰想弄清楚他的田地里有多少个池塘。 池塘是一组连接的正方形,其中有水,其中一个正方形被认为与其所有八个邻居相邻。 给出农夫约翰的田地图,确定他有多少池塘。 输入*第1行:两个以空格分隔的整数:N和M 第2…N + 1行:每行M个字符代表一行Farmer John字段。 每个字符都是’W’或’。’。 字符之间没有空格。 输出第1行:Farmer John的田地中的池塘数量。
这是一道超级简单的DFS,思路就是我们将图中所有的点初始化,然后再继续查找,找到继续执行,最后便利统计一遍。
没错,我又找到了一个可以暴搜的题目,因为又是判断连通块, 所以,这个大法好!
首先,四个方向初始化
const int dirx[9]={0,-1,-1,-1,0,0,1,1,1};
const int diry[9]={0,-1,0,1,-1,1,-1,0,1};//方向
范围以题目的要求看
bool in(int x,int y){
return x<1||x>n||y<1||y>m;//范围
}
DFS正常操作,将其图点全部归‘.’
void dfs(int x,int y){
mp[x][y]='.';//令图中所有的点'.',以便搜索
for(int i=1;i<=8;i++){
int tx=x+dirx[i];
int ty=y+diry[i];
if(in(tx,ty)||mp[tx][ty]=='.'){//范围+图
continue;//符合就继续运行
}
mp[tx][ty]='.';//将图种所有的点为
dfs(tx,ty);//遍历图
}
}
AC代码
#include
using namespace std;
const int dirx[9]={0,-1,-1,-1,0,0,1,1,1};
const int diry[9]={0,-1,0,1,-1,1,-1,0,1};//方向
int n,m;
int ans;
char mp[1000][1000];
bool in(int x,int y){
return x<1||x>n||y<1||y>m;//范围
}
void dfs(int x,int y){
mp[x][y]='.';//令图中所有的点'.',以便搜索
for(int i=1;i<=8;i++){
int tx=x+dirx[i];
int ty=y+diry[i];
if(in(tx,ty)||mp[tx][ty]=='.'){//范围+图
continue;//符合就继续运行
}
mp[tx][ty]='.';//将图种所有的点为
dfs(tx,ty);//遍历图
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]=='W'){//找到了条件
ans++;//累计
dfs(i,j);
}
}
}
cout<
珍惜生命,远离抄袭