DFS练习——踏青(DFS求连通块)

本文介绍了一个基于DFS算法寻找峡谷中相连草地的问题。蒜头君和他的朋友们需要找到失踪的朋友,通过将地图划分为不同的草地来确定最少需要多少人进行搜索。文章提供了一种有效的方法来解决这个问题并附带了实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

蒜头君和他的朋友周末相约去召唤师峡谷踏青。他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地。草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都是草丛,并且所有格子之间都能通过上下左右连通。如果用'#'代表草丛,'.'代表空地,下面的峡谷中有 2 片草地。

1##..

2..##

处在同一个草地的 2 个人可以相互看到,空地看不到草地里面的人。他们发现有一个朋友不见了,现在需要分头去找,每个人负责一片草地,蒜头君想知道他们至少需要多少人。

输入格式

第一行输入 n, m(1≤n,m≤100) 表示峡谷大小。

接下来输入 n 行字符串表示峡谷的地形。

输入格式

输出至少需要多少人。

样例输入复制

5 6
.#....
..#...
..#..#
...##.
.#....

样例输出复制

5

 


思路:

DFS求连通块,把同一块的草丛都标记

 

代码:

#include<iostream>
using namespace std;
char s[105][105];
int cot;
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int n,m;

void dfs(int x,int y)
{
    s[x][y]='.';  //将草丛置空
	for(int i=0;i<4;i++)
    {
        int tx = x + dir[i][0];
        int ty = y + dir[i][1];
        if(s[tx][ty]=='#')
            dfs(tx,ty);
    }
}

//还要求联通块
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
			cin>>s[i][j];
	for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(s[i][j]=='#')
            {
                cot++;
                dfs(i,j);
            }
        }
    cout<<cot<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值