【DFS专题训练】踏青 C++程序题 连通块问题

题目描述

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

##…
…##

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

输入

第一行输入 n, m (1 ≤ n,m ≤ 100) 表示峡谷大小。
接下来输入 n 行字符串表示峡谷的地形。

输出

输出至少需要多少人。

样例

输入

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

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

输出

5

思路

  1. 题意为求草丛数量
  2. 采用dfs
  3. 二维数组mp[][]保存地图
  4. 如果当前位置是草丛或者没有被访问过就开始搜索四周
  5. 搜四周的时候用递归保证四周都是#
#include <iostream>
using namespace std;
char mp[105][105];
int vis[105][105];
int m,n;
void dfs(int x,int y){if(x<0||x>=n||y<0||y>=n||vis[x][y]||mp[x][y]=='.'){return;}vis[x][y]=true;dfs(x+1,y);dfs(x-1,y);dfs(x,y+1);dfs(x,y-1);
}
int main(){int cnt=0;cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>mp[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!vis[i][j]&&mp[i][j]=='#'){dfs(i,j);cnt++;}}}cout<<cnt<<endl;
}

另一种dfs格式


void dfs(int x,int y){int tx,ty;for(int i=0;i<4;i++){tx=x+dir[i][0];ty=y+dir[i][1];if(tx>=0&&tx<n&&ty>=0&&ty<m&&vis[tx][ty]==0&&s[tx][ty]=='#'){vis[tx][ty]=1;dfs(tx,ty);}}
}

统一代码风格
关于连通块儿问题dfs中要判断是否到边界或者不适合的地方

#include <iostream>
using namespace std;
int n,m,x,y,cnt;
char maze[100][100];
bool vis[100][100];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool in(int x,int y){return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y){if(x<0||x>=n||y<0||y>=n||vis[x][y]||maze[x][y]=='.'){return;}vis[x][y]=1;for(int i=0;i<4;i++){int tx=x+dir[i][0];int ty=y+dir[i][1];if(in(tx,ty)&&maze[tx][ty]=='#'&&!vis[tx][ty]){dfs(tx,ty);}}
}
int main(){cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>maze[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!vis[i][j]&&maze[i][j]=='#'){dfs(i,j);cnt++;}}}cout<<cnt<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43491.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript内置对象

JavaScript内置对象 1.什么是对象&#xff1f; JavaScript中的所有事物都是对象&#xff0c;如字符串、数值、数组、函数等&#xff0c;每个对象带有属性和方法。 对象的属性&#xff1a;反映该对象某些特定的性质的&#xff0c;如&#xff1a;字符串的长度、图像的长度等。…

这个2684亿交易额里你贡献了多少?

戳蓝字“CSDN云计算”关注我们哦&#xff01; 你们的朋友圈被天猫的双十一交易额刷屏了吗&#xff1f; 1 今天一大早醒来&#xff0c;按照往常翻了一下朋友圈&#xff0c;朋友圈都在晒天猫的双十一成交额&#xff0c;大家纷纷讨论你为这个交易额贡献了多少&#xff0c;小编表示…

你必须得知道的人工智能领域的大师与大事

http://blog.itpub.net/29829936/viewspace-2647055/ 2019-06-06 15:50:22 小西&#xff1a;小迪小迪&#xff0c;我发现人工智能发展史上很多事情都跟下棋有关呐。 小迪&#xff1a;是啊&#xff0c;人工智能发展史还是要从下棋说起&#xff0c;棋类游戏很多时候都被人类看做…

老实人的归国与失身

作者&#xff1a;匿名作者 声明&#xff1a;故事情节均为虚构&#xff0c;请勿对号入座。如有雷同&#xff0c;纯属巧合。本文作者不认同文中部分行为&#xff0c;读者切勿模仿。 2008年8月&#xff0c;在东部某沿海高考大省的省会城市&#xff0c;两位15岁男生小西和小东进入…

Zookeeper(动物园管理员)为什么需要他?分布式协调系统

需求推动事物的前进&#xff0c;所有相关技术都是在某些需求的驱动下才孕育而出&#xff0c;而且不断的为了满足需求&#xff0c;不得不进一步加强完善&#xff0c;上来就说zookeeper是啥&#xff0c;作用是啥&#xff0c;干了什么&#xff0c;是开源的分布式应用协调系统”bla…

[附源码]JSP+ssm计算机毕业设计小西商店的设计与开发8yd00【源码、数据库、LW、部署】

项目运行 项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

【小西】优化生日品同步网易严选功能,使其支持多SPU对多SKU关系

目录 前言思路代码实现实体ThemeActivityGift&#xff1a;spuId由 String类型变为JSONArrayThemeActivityGiftServiceImpl改造handleYxGiftByOperation&#xff1a;保存的是严选的生日品checkSpuIds&#xff1a;校验SPU有效性checkSpuIdExist&#xff1a;校验单个spuId是否存在…

【小西】通过商品渠道新增咪咕埋点功能,ThreadUtil.execAsync()线程异步

前言 通过商品渠道新增咪咕埋点功能&#xff1a;当用户通过小西访问了咪咕相关的商品时&#xff0c;需要把这访问记录下来&#xff0c;发送给咪咕方。 实现 打算在咪咕商品api里写实现逻辑。因为小西是访问的第三方接口&#xff0c;可能会出现一些不可控因素&#xff0c;如&…

【小西】同步咪咕订单给咪咕方(写接口给第三方)

同步咪咕订单给咪咕方 前言思路实现1、定义请求体和响应信息MiGuOrderSyncReqMiGuOrderSyncResp 2、nacos定义好咪咕相关配置信息3、同步咪咕参数配置4、MiGuOrderSyncControl5、MiGuOrderSyncService6、MiGuOrderSyncServiceImplCreateAscIISignUtil 生成参数 字典排序 签名Hm…

【小西】优化若依导出功能,若依继承导出

前言 现需求是在原有的导出功能基础上&#xff0c;新增两列。 实现 因为新增两列不是数据库表中字段。因此&#xff0c;需要需要建立一个VO类。 原本想用若依继承导出&#xff0c;如下所示&#xff1a; Data public class ThemeActivityUserVO extends ThemeActivityUser…

极光尔沃A6-3d打印机体验

第一次使用3d打印机来打印模件&#xff0c;打印的是机械臂夹爪部位的小零件&#xff0c;设计的效果图如下图1所示。 图1&#xff1a;设计的夹爪部位原图 1、模件的设计 本模件使用的是solidworks软件进行的设计&#xff0c;当然可以使用其他的软件设计。最终保存的时候要以.st…

微信小游戏开发新手教程1-人人都能做游戏

如果你正在阅读这篇文章&#xff0c;那么你就是我所说的“人人”了。在此我默认你符合如下的几个条件&#xff1a; 有一定的阅读理解能力对做游戏有一定的兴趣&#xff08;否则你为什么要看这篇文章呢&#xff09;有一台电脑&#xff08;做游戏至少需要一台电脑&#xff09; …

一起用Go做一个小游戏(下)

打包资源 使用file2byteslice包我们可以将图片和config.json文件打包进二进制程序中&#xff0c;之后编译生成一个二进制程序。然后拷贝这一个文件即可&#xff0c;不用再拷贝图片和其他配置文件了。 golang有很多第三方包可以将打包资源&#xff0c;原理其实很简单——读取资源…

chatgpt赋能python:Python简单小游戏制作教程——让你学会编写游戏代码

Python简单小游戏制作教程——让你学会编写游戏代码 Python是一种高级编程语言&#xff0c;越来越受欢迎&#xff0c;因为它易于学习和使用&#xff0c;而且灵活性非常高。在这篇文章中&#xff0c;我们将教你如何用Python编写一个简单的小游戏。让我们开始吧&#xff01; 需…

ChatGPT-4终究会取代人类嘛?

随着人工智能技术的迅速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;已经成为了一个热门领域。其中&#xff0c;ChatGPT-4是一个备受瞩目的自然语言处理工具。在2022年高考语文中&#xff0c;ChatGPT-4表现出色&#xff0c;说明它在自然语言处理领域有很强的实力。…

宋宝华: 僵尸进程的成因以及僵尸可以被“杀死”吗?

僵尸不可能被杀死&#xff0c;因为它已经死了&#xff0c;不存在再死一次的问题。死的对立面是活&#xff0c;死者已死。只有活的进程才可能被杀死。 什么是僵尸 首先要明确一点&#xff0c;僵尸进程的含义是&#xff1a;子进程已经死了&#xff0c;但是父进程还没有wait它的一…

僵尸进程zombie与孤儿进程orphan

代码已上传至https://github.com/gatieme/AderXCoding/tree/master/system/unix/zombie 问题提出 以前在学习《unix环境高级编程》进程时候&#xff0c;提到孤儿进程和僵尸进程&#xff0c;但是一直对这两个概念比较模糊。于是今天做了一些测试程序,并把这些记录下来. 僵尸进程…

僵尸进程以及如何处理僵尸进程

僵尸进程&#xff1a;就是已经结束了的进程&#xff0c;但是没有从进程表中删除。太多了会导致进程表里面条目满了&#xff0c;进而导致系统崩溃&#xff0c;倒是不占用其他系统资源。最后有defunct的标记&#xff0c;就表明是僵尸进程。 今天配置Redis的时候结束停止Redis服务…

僵尸进程的一点玩法

僵尸进程的一点玩法 前言被忽略的RundownProtectionExAcquireRundownProtection 应用总结 前言 这几天在看WRK的时候&#xff0c;偶然间发现的一个东西&#xff0c;逆向之后&#xff0c;发现了个僵尸进程的玩法。目前菜鸡一枚&#xff0c;有说的不准确的地方&#xff0c;请大家…

PAT——1094 谷歌的招聘

2004 年 7 月&#xff0c;谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌&#xff08;如下图&#xff09;用于招聘。内容超级简单&#xff0c;就是一个以 .com 结尾的网址&#xff0c;而前面的网址是一个 10 位素数&#xff0c;这个素数是自然常数 e 中最早出现的 10 位连续…