病毒感染时间(字节青训营)

news2024/9/25 17:08:22
# 问题描述

在一个封闭的房间里摆满了座位,每个座位东西向和南北向都有固定 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
  •  二维布尔数组:利用一个二维布尔数组存储房间内人员口罩情况(行,列),若带口罩为 true,不戴为 false

  • 感染情况记录:再用一个二维布尔数组记录感染情况,感染为 true,根据 (x, y) 初始化感染人员位置。

  • 坐标变化定义:定义上下左右的方法坐标变化,类似于(向左:x-1,y,向下:x,y-1)。

  • 时间初始化:定义一个总时间 time = 0

  • bfs 函数定义

    • 若查询口罩情况为戴口罩,标记为不戴口罩,然后退出函数。
    • 查询感染情况,若没有感染,标记为已经感染,将这个位置加入 temp 队列,然后退出函数。
  • 主函数逻辑

    • 用一个键值对队列记录总已经感染的位置。
    • while 循环(直到队列长度等于 m*n 总座位的数量):
      • temp 队列(记录单次新增感染座位坐标),对于队列中所有感染的位置上下左右调用 bfs 函数。
      • 当次循环结束前 time += 1temp 队列元素加入总队列中。
      • 增加新位置的溢出判断和首位感染者位置是否合法的判断(若不合法,直接输出 0)。
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    static int[][] seats; // 存储口罩情况
    static boolean[][] infectionStatus; // 二维布尔数组存储感染情况
    static int[] dx = { -1, 1, 0, 0 }; // 左右下上的 x 坐标变化
    static int[] dy = { 0, 0, -1, 1 }; // 左右下上的 y 坐标变化

    public static void bfs(int x, int y, Queue<int[]> temp) {
        if (x < 0 || x >= seats.length || y < 0 || y >= seats[0].length) {
            return; // 新位置溢出判断
        }

        if (seats[x][y] == 1) {
            seats[x][y] = 0;
            return; // 如果有口罩,直接返回
        }
        if (!infectionStatus[x][y]) {
            infectionStatus[x][y] = true; // 标记为感染
            temp.offer(new int[] { x, y }); // 添加到临时队列
        }
    }

    public static int solution(int row_n, int column_m, int[][] seats, int[] patient) {
        if (patient[0] < 0 || patient[0] >= row_n || patient[1] < 0 || patient[1] >= column_m) {
            return 0; // 首位感染者位置不合法判断
        }
        Main.seats = seats;
        infectionStatus = new boolean[row_n][column_m];
        int x = patient[0];
        int y = patient[1];
        infectionStatus[x][y] = true;

        Queue<int[]> totalInfected = new LinkedList<>();
        totalInfected.offer(new int[] { x, y }); // 添加到临时队列
        Queue<int[]> temp = new LinkedList<>();
        int time = 0;

        while (totalInfected.size() < row_n * column_m) {
            // System.out.println("时间: " + time + ", 当前总感染位置数: " + totalInfected.size()); //
            // 调试打印
            for (int[] position : totalInfected) {
                int curX = position[0];
                int curY = position[1];
                for (int i = 0; i < 4; i++) {
                    int newX = curX + dx[i];
                    int newY = curY + dy[i];
                    if (newX >= 0 && newX < row_n && newY >= 0 && newY < column_m) {
                        bfs(newX, newY, temp);
                    }
                }
            }
            time++;
            totalInfected.addAll(temp);
            // System.out.println("本轮新增感染位置: " + temp.size()); // 调试打印
            temp.clear();
        }
        return time;
    }

    public static void main(String[] args) {
        // You can add more test cases here
        int[][] testSeats1 = { { 0, 1, 1, 1 }, { 1, 0, 1, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 1 } };
        int[][] testSeats2 = { { 0, 1, 1, 1 }, { 1, 0, 1, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 1 } };
        int[][] testSeats3 = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };
        int[][] testSeats4 = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } };
        int[][] testSeats5 = { { 1 } };

        System.out.println(solution(4, 4, testSeats1, new int[] { 2, 2 }) == 6);
        System.out.println(solution(4, 4, testSeats2, new int[] { 2, 5 }) == 0);
        System.out.println(solution(4, 4, testSeats3, new int[] { 2, 2 }) == 4);
        System.out.println(solution(4, 4, testSeats4, new int[] { 2, 2 }) == 6);
        System.out.println(solution(1, 1, testSeats5, new int[] { 0, 0 }) == 0);
    }
}

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

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

相关文章

特种作业管理系统 —— 企业安全与效率的卓越保障

在当今复杂多变的工业生产和作业环境中&#xff0c;安全与效率是企业发展的两大核心关键。我们深知您在特种作业管理方面面临着诸多挑战&#xff0c;如作业流程的规范性、证件的有效管理以及设备的安全运行等。今天&#xff0c;我们为您带来一款专门解决这些问题的创新产品——…

如何解决项目申报过程中文件管理混乱问题?

在项目申报的复杂流程中&#xff0c;文件管理是一项至关重要的环节。它直接关系到项目信息的完整性、安全性和可访问性。然而&#xff0c;传统的文件管理方式往往面临诸多痛点&#xff0c;如资料分散、权限混乱、版本冲突等。 文件管理痛点 资料分散难管理&#xff1a;在项目…

2024年【黑龙江省安全员C证】报名考试及黑龙江省安全员C证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 黑龙江省安全员C证报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新黑龙江省安全员C证免费试题题目及答案&#xff01;多做几遍&#xff0c;其实通过黑龙江省安全员C证模拟考试很简单。 1、【多选题】《…

如何搭建测试平台?理清思路很重要

01 测试平台 01 职责 一个健康的测试平台体系&#xff0c;对测试人员的职责分工、协作模式会有不同的要求。 测试平台核心的职责是完成高质量的交付已满足业务需求。测试活动包括单元测试、集成测试、接口测试、性能测试等&#xff0c;都是通过这些测试手段&#xff0c;协同…

22k star,最强开源堡垒机,强推

最开始接触jumpserver已经是五年前了&#xff0c;最近又发布了最新的v3版本&#xff0c;迫不及待的就去体验了一波&#xff0c;真心不错&#xff0c;增加很多新的功能&#xff0c;操作真的丝滑&#xff0c;比起公司采购的上个世纪的堡垒机真心好用多了。 1 jumpserver简介 ju…

【linux进程】深度理解进程--什么是进程什么是pcb进程创建

目录 前言一&#xff0c;对PCB的理解二&#xff0c;CPU对进程列表的处理三&#xff0c;进程标识符:pid1. 查看系统进程1: ps axj2. 查看系统进程2: /proc 四&#xff0c;系统调用函数:getpid五&#xff0c;父进程和子进程的概念六&#xff0c;创建子进程--fork函数的使用1. 创建…

CSS颜色设置

我们在显示屏上看到的各种颜色都是通过红&#xff08;red&#xff09;、绿&#xff08;green&#xff09;、蓝&#xff08;blue&#xff09;三原色组合而成的&#xff0c;按不同的比例混合这三种颜色就可以得到其它颜色&#xff0c;通过调整红、绿、蓝三种颜色的数值可以最大限…

微信开发者工具审查界面元素

一、打开调试器 二、审查元素 点击调试器左边的箭头&#xff0c;将鼠标放在界面上即可审查元素

Node-RED-L2-Node-RED在Linux系统启动时自动运行

Node-RED在Linux系统启动时自动运行 目的步骤1创建服务文件&#xff1a;2重新加载服务&#xff1a;3启用服务&#xff1a;4启动Node-RED服务&#xff1a;5检查服务状态&#xff1a;6其他说明7如果没启动正确的Node-RED执行路径&#xff1a;确保使用绝对路径&#xff1a; 检查用…

Servlet入门:服务端小程序的初试(自己学习整理的资料)

目录 一.前言 二.建立基础结构​编辑 三.具体步骤 找到Tomcat文件并打开Tomcat。 在webapps中创建一个自己的文件夹。 在classes中新建一个Java文件。 在lib中导入需要的jar文件包。 配置环境变量 在Java文件的目录下打开cmd并输入 javac -d . HelloServlet.java进行…

深兰科技陈海波应邀出席2024长三角论坛暨虹桥人才创新发展大会

近日&#xff0c;以“人才引领 联动共融——国际化创新与长三角协同”为主题的“2024长三角人才发展论坛暨虹桥人才创新发展大会”在上海国际会议中心隆重举行。上海市委常委、组织部部长、市委人才办主任张为应邀出席并做大会致辞。 深兰科技创始人、董事长陈海波作为特邀企业…

多用户自定义商城小程序源码系统 独立部署 到源代码包以及搭建部署教程

系统概述 随着移动互联网的迅猛发展&#xff0c;消费者的购物习惯逐渐向线上转移。传统电商平台虽然提供了一定的便利&#xff0c;但也存在一些局限性&#xff0c;如高昂的入驻费用、缺乏个性化定制等。为了适应市场需求&#xff0c;多用户自定义商城小程序源码系统应运而生。…

linux 之0号进程、1号进程、2号进程

一、0号进程 0号进程&#xff0c;通常也被称为idle进程&#xff0c;或者也称为swapper进程&#xff0c;其 pid 等于0。 0号进程是linux启动的第一个进程&#xff0c;它的task_struct的comm字段为"swapper",所以也称为swpper进程。 kernel/include/linux/init_task…

IO分类,IO模型,Java中的IO模式

写在前面 本文看下几个比较容易混肴的概念&#xff0c;IO分类&#xff0c;IO模型&#xff0c;Java的IO模式。当然&#xff0c;都是我自己的理解&#xff0c;有哪里不对的&#xff0c;烦请留言告知。 1&#xff1a;IO分类 IO分类是针对阻塞与非阻塞&#xff0c;异步与同步来讲…

.net 到底行不行!2000 人在线的客服系统真实屏录演示(附技术详解)

业余时间用 .net 写了一个免费的在线客服系统&#xff1a;升讯威在线客服与营销系统。 时常有朋友问我性能方面的问题&#xff0c;正好有一个真实客户&#xff0c;在线的访客数量达到了 2000 人。在争得客户同意后&#xff0c;我录了一个视频。 升讯威在线客服系统可以在极低…

基于SSM+Vue+MySQL的农家乐预约管理系统

系统展示 用户前台界面 管理员后台界面 农家乐后台界面 系统背景 随着乡村旅游的兴起&#xff0c;农家乐作为一种结合农业体验与休闲度假的新型旅游模式&#xff0c;受到了广大游客的青睐。然而&#xff0c;传统农家乐在预约管理方面存在效率低下、信息不透明等问题&#xff0c…

头戴式耳机百元测评推荐有哪些?头戴式耳机性价比排名推荐!

在音频设备日益普及的今天&#xff0c;头戴式耳机因其出色的音质和舒适度备受欢迎。然而&#xff0c;面对市场上琳琅满目的百元耳机&#xff0c;消费者常常感到困惑。头戴式耳机百元测评推荐有哪些&#xff1f;在这篇文章中&#xff0c;我们将测评并推荐几款性价比极高的头戴式…

Python爬虫之requests模块(一)

Python爬虫之requests模块&#xff08;一&#xff09; 学完urllib之后对爬虫应该有一定的了解了&#xff0c;随后就来学习鼎鼎有名的requests模块吧。 一、requests简介。 1、什么是request模块&#xff1f; requests其实就是py原生的一个基于网络请求的模块&#xff0c;模拟…

第一届POLARDB数据库性能大赛-亚军0xCC☣☢比赛攻略

关联比赛: 第一届POLARDB数据库性能大赛 1 赛题分析 本次大赛的初赛和复赛的赛题内容是一脉相传的&#xff0c;主要内容都是实现一个KV数据库存储引擎&#xff0c;实现随机插入&#xff0c;随机查询&#xff0c;区间查询这三个功能。赛题的难点主要有两个&#xff1a;1、实现在…

C#常用数据结构栈的介绍

定义 在C#中&#xff0c;Stack<T> 是一个后进先出&#xff08;LIFO&#xff0c;Last-In-First-Out&#xff09;集合类&#xff0c;位于System.Collections.Generic 命名空间中。Stack<T> 允许你将元素压入栈顶&#xff0c;并从栈顶弹出元素。 不难看出&#xff0c;…