当前位置: 首页 > news >正文

62.病毒在封闭空间中的传播时间|Marscode AI刷题

1.题目

问题描述

在一个封闭的房间里摆满了座位,每个座位东西向和南北向都有固定 1 米的间隔。座位上坐满了人,坐着的人可能带了口罩,也可能没有带口罩。我们已经知道房间里的某个人已经感染了病毒,病毒的传播速度是每秒钟感染距离 1 米,但是超出 1 米病毒没有感染效力。病毒对于戴口罩的人需要两秒钟,或者一秒内被周围的两个人分别感染一次,才能被病毒感染。请实现一个算法,计算出来在给定的人员戴口罩情况,以及已经感染的人员位置情况下,病毒感染屋内所有人所需的时间。假定,已经感染的人戴和不戴口罩都具有相同的感染能力。

输入格式

第一行两个整数 n, m,表示座位有 n 行 m 列

接下来 n 行,每行 m 个整数 T(i, j)表示座位上的人戴口罩情况,0 表示未戴口罩,1 表示戴了口罩

最后一行两个整数 x, y 表示已经感染病毒的人所在座位

输出格式

输出一个整数表示病毒感染屋内所有人所需的时间

输入样例

4 4

0 1 1 1

1 0 1 0

1 1 1 1

0 0 0 1

2 2

输出样例

6

数据范围

座位横向和纵向最多 255

2.思路

1. 初始化

  • 定义方向数组用于遍历相邻位置。
  • 准备队列用于 BFS 遍历,队列元素包含位置和感染时间。
  • 构建感染时间矩阵,初始化为无穷大,记录各位置最早感染时间。
  • 确定初始感染者位置,将其加入队列,感染时间设为 0。

2. 广度优先搜索(BFS)

  • 从队列取出元素,代表当前感染位置和时间。
  • 遍历其四个相邻位置,检查是否在矩阵内。
  • 根据相邻位置的人是否戴口罩,计算新的感染时间:
    • 未戴口罩,感染时间加 1 秒。
    • 戴口罩,通常感染时间加 2 秒,若被两个不同方向感染者同时感染,感染时间减为加 1 秒。
  • 若新感染时间更小,更新感染时间矩阵并将该位置入队。

3. 结果计算与判断

  • 遍历感染时间矩阵:
    • 若有位置感染时间仍为无穷大,说明无法感染,返回 -1。
    • 找出最大感染时间并返回。

3.代码

#include <iostream>
#include <vector>
#include <queue>
#include <limits>
#include <tuple>
using namespace std;int solution(int row_n, int column_m, std::vector<std::vector<int>> seats, std::vector<int> patient) {// Please write your code here// 定义四个方向:右、下、左、上vector<pair<int, int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};// 使用队列进行广度优先搜索(BFS),存放的是一个 三元组 (行号, 列号, 时间)queue<tuple<int, int, int>> queue;// 记录每个位置被感染的最早时间,初始设为无穷大vector<vector<int>> infected_time(row_n, vector<int>(column_m, numeric_limits<int>::max()));// 获取初始感染者的位置int start_row = patient[0];int start_col = patient[1];// 将初始感染者加入队列,感染时间设为 0queue.push({start_row, start_col, 0});infected_time[start_row][start_col] = 0;// 进行 BFS 遍历while(!queue.empty()) {auto [r, c, time] = queue.front();queue.pop();// 遍历四个方向for (auto [dr, dc] : directions) {int nr = r + dr;int nc = c + dc;// 检查边界if (0 <= nr && nr < row_n && 0 <= nc && nc < column_m) {int new_time;if (seats[nr][nc] == 0) { // 未带口罩new_time = time + 1;} else { // 戴口罩new_time = time + 2;int adjacent_infected = 0;// 计算周围已感染的邻居数量for (auto [dr2, dc2] : directions) {int ar = nr + dr2;int ac = nc + dc2;if (0 <= ar && ar < row_n && 0 <= ac && ac < column_m && infected_time[ar][ac] == time) {adjacent_infected += 1;}}// 若被两个不同方向的感染者感染,则感染时间减少到 1 秒if (adjacent_infected >= 2) {new_time = min(new_time, time + 1);}}// 只有当新感染时间比当前已记录的感染时间更小时,才更新并入队if (new_time < infected_time[nr][nc]) {infected_time[nr][nc] = new_time;queue.push({nr, nc, new_time});}}}}// 计算最晚感染的时间int max_time = 0;for (int r = 0; r < row_n; ++r) {for (int c = 0; c < column_m; ++c) {// 若某些人无法被感染,则返回 -1if  (infected_time[r][c] == numeric_limits<int>::max()) {return - 1;}max_time = max(max_time, infected_time[r][c]);}}return max_time;
}
int main() {//  You can add more test cases herestd::vector<std::vector<int>> testSeats1 = {{0,1,1,1},{1,0,1,0},{1,1,1,1},{0,0,0,1}};std::vector<std::vector<int>> testSeats2 = {{0,1,1,1},{1,0,1,0},{1,1,1,1},{0,0,0,1}};std::vector<std::vector<int>> testSeats3 = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};std::vector<std::vector<int>> testSeats4 = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};std::vector<std::vector<int>> testSeats5 = {{1}};std::cout << (solution(4, 4, testSeats1, {2, 2}) == 6) << std::endl;std::cout << (solution(4, 4, testSeats2, {2, 5}) == 0) << std::endl;std::cout << (solution(4, 4, testSeats3, {2, 2}) == 4) << std::endl;std::cout << (solution(4, 4, testSeats4, {2, 2}) == 6) << std::endl;std::cout << (solution(1, 1, testSeats5, {0, 0}) == 0) << std::endl;return 0;
}

4.参考资料

AI刷题-病毒在封闭空间中的传播时间-CSDN博客

相关文章:

62.病毒在封闭空间中的传播时间|Marscode AI刷题

1.题目 问题描述 在一个封闭的房间里摆满了座位&#xff0c;每个座位东西向和南北向都有固定 1 米的间隔。座位上坐满了人&#xff0c;坐着的人可能带了口罩&#xff0c;也可能没有带口罩。我们已经知道房间里的某个人已经感染了病毒&#xff0c;病毒的传播速度是每秒钟感染距…...

Elixir语言的安全开发

Elixir语言的安全开发 引言 在当今这个互联网高度发展的时代&#xff0c;软件的安全性变得越来越重要。随着网络攻击的增多&#xff0c;软件漏洞的频繁暴露&#xff0c;开发者面临着前所未有的安全挑战。Elixir&#xff0c;作为一种现代化的函数式编程语言&#xff0c;以其高…...

Rust 条件语句

Rust 条件语句 在编程语言中&#xff0c;条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言&#xff0c;其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句&#xff0c;包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...

小红的合数寻找

A-小红的合数寻找_牛客周赛 Round 79 题目描述 小红拿到了一个正整数 x&#xff0c;她希望你在 [x,2x] 区间内找到一个合数&#xff0c;你能帮帮她吗&#xff1f; 一个数为合数&#xff0c;当且仅当这个数是大于1的整数&#xff0c;并且不是质数。 输入描述 在一行上输入一…...

使用等宽等频法进行数据特征离散化

在数据分析与处理的过程中,特征离散化是一种常见的操作。通过将连续的数值型数据转换为离散类别,能够更好地处理数据,尤其是在机器学习模型中进行分类问题的建模时。离散化能够简化数据结构,减少数据噪声,并提高模型的解释性。 本文将详细介绍如何使用 pandas 库中的 cut…...

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作

目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中&#xff0c;同义词&#xff08;Synonym&#xff09;是对数…...

AI协助探索AI新构型的自动化创新概念

训练AI自生成输出模块化代码&#xff0c;生成元代码级别的AI功能单元代码&#xff0c;然后再由AI组织为另一个AI&#xff0c;实现AI开发AI的能力&#xff1b;用AI协助探索迭代新构型AI将会出现&#xff0c;并成为一种新的技术路线潮流。 有限结点&#xff0c;无限的连接形式&a…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)

目录 OLED设备层驱动开发 如何抽象一个OLED 完成OLED的功能 初始化OLED 清空屏幕 刷新屏幕与光标设置1 刷新屏幕与光标设置2 刷新屏幕与光标设置3 绘制一个点 反色 区域化操作 区域置位 区域反色 区域更新 区域清空 测试我们的抽象 整理一下&#xff0c;我们应…...

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用

Redis 是一个高性能的键值存储系统&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。在面试中&#xff0c;Redis 是一个高频话题&#xff0c;尤其是其核心概念、数据结构、持久化机制和高可用性方案。 1. Redis 是什么&#xff1f;它的主要特点是什么&#xff1f; 答案&a…...

TensorFlow 示例摄氏度到华氏度的转换(一)

TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换&#xff0c;可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …...

7.DP算法

DP 在C中&#xff0c;动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题来高效求解的算法设计范式。以下是DP算法的核心要点和实现方法&#xff1a; 一、动态规划的核心思想 重叠子问题&#xff1a;问题可分解为多个重…...

Baklib构建高效协同的基于云的内容中台解决方案

内容概要 随着云计算技术的飞速发展&#xff0c;内容管理的方式也在不断演变。企业面临着如何在数字化转型过程中高效管理和协同处理内容的新挑战。为应对这些挑战&#xff0c;引入基于云的内容中台解决方案显得尤为重要。 Baklib作为创新型解决方案提供商&#xff0c;致力于…...

在C语言多线程环境中使用互斥量

如果有十个银行账号通过不同的十条线程同时向同一个账号转账时&#xff0c;如果没有很好的机制保证十个账号依次存入&#xff0c;那么这些转账可能出问题。我们可以通过互斥量来解决。 C标准库提供了这个互斥量&#xff0c;只需要引入threads.头文件。 互斥量就像是一把锁&am…...

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么&#xff0c;有存就有取 在取值的时候&#xff0c;报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中&#xff1a;LoginUser u…...

代码随想录刷题笔记

数组 二分查找 ● 704.二分查找 tips&#xff1a;两种方法&#xff0c;左闭右开和左闭右闭&#xff0c;要注意区间不变性&#xff0c;在判断mid的值时要看mid当前是否使用过 ● 35.搜索插入位置 ● 34.在排序数组中查找元素的第一个和最后一个位置 tips&#xff1a;寻找左右边…...

AI智慧社区--人脸识别

前端 人脸的采集按钮&#xff1a; 首先对于选中未认证的居民记录&#xff0c;进行人脸采集 前端的按钮 <el-form-item><el-button v-has"sys:person:info" type"info" icon"el-icon-camera" :disabled"ids.length < 0" …...

对象的实例化、内存布局与访问定位

一、创建对象的方式 二、创建对象的步骤: 一、判断对象对应的类是否加载、链接、初始化: 虚拟机遇到一条new指令&#xff0c;首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已经被加载、解析和初始化…...

React基础知识回顾详解

以下是React从前端面试基础到进阶的系统性学习内容&#xff0c;包含核心知识点和常见面试题解析&#xff1a; 一、React基础核心 JSX原理与本质 JSX编译过程&#xff08;Babel转换&#xff09;虚拟DOM工作原理面试题&#xff1a;React为何使用className而不是class&#xff1f;…...

开发第一个安卓页面

一&#xff1a;在java.com.example.myapplication下创建MainActivity的JAVA类 里面的代码要把xml的页面名字引入 二&#xff1a;如果没有这两个&#xff0c;可以手动创建layout文件夹和activity_main.xml activity_main.xml使用来做页面的。 三、找到这个文件 把你的JAVA类引入…...

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

一、MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种基于发布/订阅模式的轻量级通讯协议&#xff0c;构建于TCP/IP协议之上。它最初由IBM在1999年发布&#xff0c;主要用于在硬件性能受限和网络状况不佳的情…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...