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;
} 
改革尚未成功,同志仍需努力!!!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值