Lake Counting【DFS】练习

Lake Counting
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述:
由于最近的降雨,农民约翰的田地里的水聚集在不同的地方,用一个n×m(1≤n≤100;1 <= m <= 100)平方。每个正方形包含水( ‘ w ’ )或旱地( ‘ . ’ ))。农民约翰想知道他的地里已经形成了多少池塘。池塘是一组相连的正方形,里面有水,其中一个正方形被认为与其所有八个邻居相邻。

给一张农民约翰的田地图,确定他有多少池塘。

输入:
第1行:两个空格分隔的整数:n和m
第2行:每行n+1: m个字符,代表一行农民约翰的田地。每个字符不是“w”就是“.”。字符之间没有空格。

输出:
农民约翰田地里池塘的数量。

样例输入:
在这里插入图片描述
样例输出:

3

接触DFS的第二个算法了,hhhhh
上一个是部分和问题,看完这个后感觉一般的深度优先搜索都莫得问题了,啊哈哈哈。。。咳咳
先来谈谈解题过程吧!!

我们从任意一个 “ W ” 开始入手,进去后直接将其用 " . " 来替换,然后设置条件进行DFS递归就好啦!当然啦,一次dfs的递归只能将与初始 " W " 相连的w全部替换掉,然后count记一次数。直到数组不会存在 w 为止。其中我们可以设置一个双重循环来控制八个方向,(原来还傻傻的分开打了八个循环来分别递归实现,真的笨死了,hhhh)不说了不说了,放代码。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
char a[100][100];
int n,m;
void dfs(int i,int j)
{
	a[i][j]='.';
	for(int x=-1;x<=1;x++)
		for(int y=-1;y<=1;y++)
		{
			int xi=i+x,yj=j+y;
			if(xi>=0&&xi<n&&yj>=0&&yj<m&&a[xi][yj]=='W')dfs(xi,yj);  //判断是否dfs的条件;
		}
	return ;	
}
int main()
{
	int count=0;
	cin >> n >> m;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin >> a[i][j];
		} 	
	} 	
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			if(a[i][j]=='W')
			{
				dfs(i,j);
				count++;
			}
		}	
	cout << count << endl;
	return 0;
} 
改革尚未成功,同志仍需努力!!!
发布了16 篇原创文章 · 获赞 26 · 访问量 1150

猜你喜欢

转载自blog.csdn.net/qq_43514659/article/details/103473487