红与黑(bfs, acwing)

题目描述:

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。
你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。
请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式:

输入包括多个数据集合。
每个数据集合的第一行是两个整数 W 和 H,分别表示 x 方向和 y 方向瓷砖的数量。
在接下来的 H 行中,每行包括 W 个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:红色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。

输出格式:

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

数据范围:

1≤W,H≤20

输入样例:

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0

输出样例:

45

 分析步骤:

  第一:我们拿到这道题应该一眼就能够这是一道要搜索的题目,我们有红色瓷砖的话就不可以行走了,相当于一座高山我们的黑色瓷砖可以行走,我们搜索也只能搜索黑色瓷砖,相当于一旦当海水进入之后只能向低洼的地区流。 想到此处我们应该运用Flood Fill 和 BFS 就能够解出答案。     

  第二:书写主函数构建整体架构

             由于这题没有固定的输入次数,所以应该在while循环的判断中输入值,并且判断是否为0即可,每次输入一个新的值我们就应该清除一下我们的地图,定义一个cnt为计数器。随后将地图输入进去,并且判断一下哪个坐标为”@“并将其横纵坐标记录下来。之后进行bfs搜索

int main()
{while(cin>>n>>m,m||n){memset(map, 0, sizeof map);cnt = 1 ;for(int i = 0 ; i < m ;  i++){for(int j = 0 ; j < n ; j ++){cin>>map[i][j];if(map[i][j] == '@') {x1 = i , y1 = j; }}}cout<<bfs(x1,y1)<<endl;}return 0;
}

      第三:书写BFS

                 每次进入我们的 bfs 都应该更新一下我们的坐标状态,因为我们不止有一组地图 。一般我们书写bfs都会手写队列。所以将此点改变状态改为true标记为走过了,定义头节点为0 ,尾节点为0,用他们来判断我们的队列是否为空 , 将刚刚进入的点放入队列。

                进入while循环只要队列不为空就一直循环下去,因为队列里有符合条件的点还没有判断。定义一个迭代器去向后遍历队列,随后进行四方搜索,所搜看看这个点周围是否存在其他的黑色瓷砖。之后要判断我们新的坐标的这个点是否符合条件。如果1.边界符合条件;2.没有重复走过;3.不是红色瓷砖,都满足的话那么这个点就是我们要找的点,将其放入队列,更新状态,计数器++。最后返回cnt的答案。

int bfs(int xx , int yy){memset(st, false, sizeof st);st[xx][yy] = true;int hh = 0 , tt = 0 ;q[0] = {xx, yy};while(hh <= tt){auto t = q[hh++];for(int i = 0 ; i < 4 ; i ++){int a = t.x+dx[i] , b = t.y+dy[i];if(a < 0 || b < 0 || a >= m || b >= n) continue;if(st[a][b]) continue;if(map[a][b] == '#') continue;st[a][b] = true;q[++tt] = {a,b};cnt++;}}return cnt; 
}

注意注意:我们bfs的书写是相当有规律的,

                  首先更新该点状态并将其放入队列,定义头节点尾节点。

                  进入while循环只要不空就一直循环下去,利用迭代器自己向后遍历

                  进行方向搜索判断问题一般是三个问题:1.是否已经走过了这个点;2.是否有边界问题;3.是否有障碍物而无法通过

                  如果都没有问题则将其入队,更新坐标点的状态

                 最后返回 

                大家记住即可。很简单,到时候遇到了BFS的题目就直接套上去就行。

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y secondusing namespace std;const int N = 30;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int n , m ;
int x1=-1 , y1=-1;
int cnt = 1 ;
char map[N][N];
typedef pair<int, int> PII;
PII q[N*N];
bool st[N][N];int bfs(int xx , int yy){memset(st, false, sizeof st);st[xx][yy] = true;int hh = 0 , tt = 0 ;q[0] = {xx, yy};while(hh <= tt){auto t = q[hh++];for(int i = 0 ; i < 4 ; i ++){int a = t.x+dx[i] , b = t.y+dy[i];if(a < 0 || b < 0 || a >= m || b >= n) continue;if(st[a][b]) continue;if(map[a][b] == '#') continue;st[a][b] = true;q[++tt] = {a,b};cnt++;}}return cnt; 
}int main()
{while(cin>>n>>m,m||n){memset(map, 0, sizeof map);cnt = 1 ;for(int i = 0 ; i < m ;  i++){for(int j = 0 ; j < n ; j ++){cin>>map[i][j];if(map[i][j] == '@') {x1 = i , y1 = j; }}}cout<<bfs(x1,y1)<<endl;}return 0;
}

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

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

相关文章

03 龙芯平台openstack部署搭建-keystone部署

#!/bin/bash #创建keystone数据库并授权&#xff0c;可通过mysql -ukeystone -ploongson验证授权登录 mysql -uroot -e “set password for rootlocalhost password(‘loongson’);” mysql -uroot -ploongson -e ‘CREATE DATABASE keystone;’ #本地登录 mysql -uroot -ploo…

【Linux】进程---概念---进程---优先级

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.操作系统(Operator System) 1.1 概念 1.2 设计OS的目的 1.3 定位 1.4 如何理解 "管理" 1.5 总结 1.6 系统调用和…

蓝桥杯刷题总结(Python组)

1、蛇形矩阵 解题思路&#xff1a;每次赋值后都对方向进行改变&#xff0c;一般上下左右就是&#xff08;-1&#xff0c;0&#xff09;&#xff0c;&#xff08;0&#xff0c;1&#xff09;&#xff0c;&#xff08;1&#xff0c;0&#xff09;&#xff0c;&#xff08;0&…

智慧城市物联网建设:提升城市管理效率与居民生活品质

目录 一、智慧城市物联网建设的意义 1、提升城市管理效率 2、改善居民生活品质 3、促进城市可持续发展 二、智慧城市物联网建设面临的挑战 1、技术标准与互操作性问题 2、数据安全与隐私保护问题 3、投资与回报平衡问题 三、智慧城市物联网建设的实施策略 1、制定统一…

Linux下安装多个nodejs并映射Jenkins

背景 需要Jenkins中切换多个Node&#xff0c;比如nodejs16和nodesjs18,所以在宿主机按照好这两个版本&#xff0c;然后再映射到Jenkins容器中 步骤 1.下载地址 https://nodejs.org/dist/ 放到 cd /opt/soft/2.解压 tar -xzvf node-v16.20.0-linux-x64.tar.gz tar -xzvf n…

STM32F4+薄膜压力传感器(FSR)AO模拟输出程序ADC模数转换器详解

前言&#xff1a;博主在使用STM32F4加薄膜压力传感器用来测量压力时&#xff0c;发现给的例程只有STM32F1系列的&#xff0c;而STM32F4系列库函数程序不太一致&#xff0c;博主实战解决了该问题&#xff0c;用STM32F4标准库开发。有关ADC模数转换器的详细知识点详情点击我的博文…

ChatGPT是什么,怎么使用,需要注意些什么?

一、ChatGPT 是什么&#xff1f; ChatGPT&#xff0c;全称聊天生成预训练转换器&#xff08;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是 OpenAI 开发的人工智能(AI)聊天机器人程序&#xff0c;于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的…

关于物联网的技术与概念

什么是嵌入式系统&#xff1f; 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;能够根据用户需求&#xff08;功能、可靠性、成本、体积、功耗、环境等&#xff09;灵活裁剪软硬件模块的专用计算机系统。它们通常用于特定的任务&#xff0c;具有高度的集…

基于java+springboot+vue实现的旅游信息管理系统(文末源码+Lw+ppt)23-464

摘 要 本系统为用户而设计制作旅游信息管理系统&#xff0c;旨在实现旅游信息智能化、现代化管理。本旅游信息管理自动化系统的开发和研制的最终目的是将旅游信息的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利和条件…

【C语言】空心正方形图案

思路&#xff1a; 1&#xff0c;两行两列打印* &#xff1a;第一行和最后一行&#xff0c;第一列和最后一列。 2&#xff0c;其他地方打印空格。 代码如下&#xff1a; #include<stdio.h> int main() { int n 0; int i 0; int j 0; while (scanf("…

centos创建并运行一个redis容器 并支持数据持久化

步骤 : 创建redis容器命令 docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes 进入容器 : docker exec -it mr bash 链接redis : redis-cli 查看数据 : keys * 存入一个数据 : set num 666 获取数据 : get num 退出客户端 : exit 再退…

GaussDB分区表自动新增分区

前言 GaussDB是华为自主研发的企业级分布式关系型数据库&#xff0c;支持集中式和分布式两种部署方式。为企业提供了高可用&#xff0c;高可靠&#xff0c;高安全等能力&#xff0c;其产品全栈自研&#xff0c;并且具有完善生态工具和开源社区。在实际去O的项目过程&#xff0…

oracle pctfreepctused介绍

pctfree这个参数定义了一个块保留空间的百分比&#xff0c;保留空间是为了将来可能发生的更新操作&#xff0c;因为更新可能增大被更新行占用的空间&#xff0c;如果此时该块没有可利用空间&#xff0c;那么只有发生row migrate了&#xff0c;从而会降低I/O性能。换句话说&…

自己录的视频怎么配上字幕?推荐几种方法

自己录的视频怎么配上字幕&#xff1f;在数字化时代&#xff0c;视频已经成为人们获取信息、娱乐消遣的重要形式。而对于许多内容创作者来说&#xff0c;为自己的视频添加字幕不仅能提升观众的观看体验&#xff0c;还能增加视频的专业度和吸引力。那么&#xff0c;如何为自己的…

MM1: Methods, Analysis Insights from Multimodal LLM Pre-training

MM1: Methods, Analysis & Insights from Multimodal LLM Pre-training 相关链接&#xff1a;arxiv 关键字&#xff1a;多模态学习、大型语言模型、预训练、视觉语言连接、混合专家模型 摘要 本文讨论了构建高性能的多模态大型语言模型&#xff08;MLLMs&#xff09;。特别…

Qt5信号槽机制详解(最新,超级详细!!!)

Qt5信号槽机制详解 目录 信号槽机制的特征Qt4与Qt5中的connect函数讲解信号槽机制示例代码使用Lambda函数作为槽函数 1. 信号槽机制的特征 在Qt5中&#xff0c;信号&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;具有以下特征&#xff1a; 信号&#xff…

【鸿蒙HarmonyOS开发笔记】动画过渡效果之布局更新动画

概述 动画的原理是在一个时间段内&#xff0c;多次改变UI外观&#xff0c;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧&#xff0c;对应一次屏幕刷新&#xff0c;而决定动画流畅度的一个重要指标就是帧率FPS&#x…

云原生(四)、Docker-Compose

Docker-Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个简单的 YAML 文件来配置应用程序的服务、网络和卷&#xff0c;从而使得在不同环境中轻松部署应用程序变得更加简单和可靠。 Docker Compose 主要由以下几个核心组件组成&#xf…

前端开发者如何开发自己的地图功能

地图开发 市面上有高德&#xff0c;百度属于常用的&#xff0c;以及小程序内置的腾讯地图&#xff0c;通常用这部分的功能&#xff0c;都需要申请对应的key&#xff0c;来进行使用&#xff0c;一般刚刚开始流量不大&#xff0c;到没什么&#xff0c;流量一大就需要付费。 如何…

数库据设计最佳实践

中老年程序员&#xff0c;从业生涯设计过很多数据库&#xff0c;有用上的也有没用上的&#xff0c;有精心设计花无数心思更改了无数次的也有敷衍了事能用就行的&#xff0c;有最糟糕的设计也有感觉还不错的。在设计和修改过程中有很多疑问和感悟&#xff0c;在此记录一下以方便…