Problem : Lake Counting

Problem : Lake Counting

    • Description
      • Input
      • Output
      • Sample Input
      • Sample Output
      • HINT
    • 解析部分
      • 思路
      • 解题
    • 代码部分

Description

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.

Input

  • 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.

Output

  • Line 1: The number of ponds in Farmer John’s field.

Sample Input

10 12
W…WW.
.WWW…WWW
…WW…WW.
…WW.
…W…
…W…W…
.W.W…WW.
W.W.W…W.
.W.W…W.
…W…W.

Sample Output

3

HINT

翻译:
描述由于最近的降雨,水汇集在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<

珍惜生命,远离抄袭

你可能感兴趣的:(题解)