Lake Counting S(洛谷)

题目描述
由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。

我们用一个 N x M 网格图表示,每个网格中有水 W 或是旱地 .

一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。

约翰想弄清楚他的田地已经形成了多少水坑,给出约翰田地的示意图,确定当中有多少水坑。

输入格式
第 1 行:两个空格隔开的整数:N 和 M
第 2 行 ~ 第 N+1 行:每行 M 个字符,每个字符是 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

样例解释
有三个池塘: 一个在左上角,一个在左下角,一个在右边。


题解一
DFS:

#include <iostream>
using namespace std;

const int N = 110;

int n, m;
char g[N][N];
bool st[N][N];

void dfs(int x, int y)
{
    
    
	st[x][y] = true;
	for (int i = -1; i <= 1; i ++)
		for (int j = -1; j <= 1; j ++)
		{
    
    
			int a = x + i, b = y + j;
			if(a < 1 || a > n || b < 1 || b > m) continue;
			if(g[a][b] == '.' || st[a][b]) continue;
			
			dfs(a, b);
		}
}

int main()
{
    
    
	cin >> n >> m;
	
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			cin >> g[i][j];
			
	int ans = 0;		
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			if(g[i][j] == 'W' && !st[i][j])
			{
    
    
				ans ++;
				dfs(i, j);
			}		
			
	cout << ans << endl;
	return 0;		
}

题解二
BFS:

扫描二维码关注公众号,回复: 11940929 查看本文章
#include <iostream>
#include <queue>

#define x first
#define y second
using namespace std;

const int N = 110;

typedef pair<int, int> PII;

queue<PII> q;

int n, m;
char g[N][N];
bool st[N][N];

void bfs(int x, int y)
{
    
    
	q.push(make_pair(x, y));
	st[x][y] = true;
	
	while(q.size())
	{
    
    
		PII t = q.front();
		q.pop();
		
		for (int i = -1; i <= 1; i ++)
			for (int j = -1; j <= 1; j ++)
			{
    
    
				int a = t.x + i, b = t.y + j;
				if(a < 1 || a > n || b < 1 || b > m) continue;
				if(g[a][b] == '.' || st[a][b]) continue;
				
				q.push(make_pair(a, b));
				st[a][b] = true;
			}
	}
}

int main()
{
    
    
	cin >> n >> m;
	
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			cin >> g[i][j];
			
	int ans = 0;		
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			if(g[i][j] == 'W' && !st[i][j])
			{
    
    
				ans ++;
				bfs(i, j);
			}		
			
	cout << ans << endl;
	return 0;		
}

猜你喜欢

转载自blog.csdn.net/weixin_46239370/article/details/108938395