【华为机试】2023年真题B卷(python)-计算疫情扩散时间

一、题目

题目描述:

请根据给定的地图计算,多少天以后,全部区域都会被感染。

如果初始地图上所有区域全部都被感染,或者没有被感染区域,返回-1

二、输入输出

输入描述:

一行N*N个数字(只包含0,1,不会有其他数字)表示一个地图,数字间用,分割,

0表示未感染区域,

1表示已经感染区域 每N个数字表示地图中一行,输入数据共表示N行N列的区域地图。

例如输入1,0,1,0,0,0,1,0,1,表示地图:

1,0,1

0,0,0

1,0,1
输出描述:

一个整数,表示经过多少天以后,全部区域都被感染

三、示例

示例1:

输入:

1,0,1,0,0,0,1,0,1

输出:

2

说明:

1天以后,地图中仅剩余中心点未被感染;2天以后,全部被感染。
示例2:

输入:

0,0,0,0

输出:

-1

说明:

无感染区域
示例3:

输入:

1,1,1,1,1,1,1,1,1

输出:

-1

说明:

全部都感染 备注: 1<=N<200

四、要求

时间限制:C/C++ 1秒,其他语言 2秒

空间限制:C/C++262144K,其他语言524288K

五、参考代码

python 复制代码
# -*- coding: utf-8 -*-
'''
@File    :   2023-B-计算疫情扩散时间.py
@Time    :   2023/12/29 23:18:02
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

import math

# 定义四个方向的偏移量
directions = [[0, 1], [0, -1], [1, 0], [-1, 0]]

def calculate_days_to_infect():
    # 读取输入并计算地图大小
    nums = [int(x) for x in input().split(",")]
    n = int(math.sqrt(len(nums)))

    # 创建二维矩阵并初始化为0
    matrix = [[0 for _ in range(n)] for _ in range(n)]

    infected_zones = []
    for i in range(n):
        for j in range(n):
            matrix[i][j] = nums[i * n + j]
            if matrix[i][j] == 1:
                infected_zones.append([i, j])

    if len(infected_zones) == 0 or len(infected_zones) == len(nums):
        return -1
    else:
        healthy = len(nums) - len(infected_zones)

        result = 0
        while len(infected_zones) > 0 and healthy > 0:
            new_infected_zones = []

            for x, y in infected_zones:
                result = matrix[x][y] + 1

                for direction in directions:
                    next_x = x + direction[0]
                    next_y = y + direction[1]

                    if next_x < 0 or next_x >= n or next_y < 0 or next_y >= n:
                        continue

                    if matrix[next_x][next_y] == 0:
                        healthy -= 1
                        matrix[next_x][next_y] = result
                        new_infected_zones.append([next_x, next_y])

            infected_zones = new_infected_zones

        return result - 1

# 调用方法并打印结果
result = calculate_days_to_infect()
print(result)
相关推荐
不去幼儿园几秒前
【启发式算法】Dijkstra算法详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法·图搜索算法
McQueen_LT7 分钟前
聊天室Python脚本——ChatGPT,好用
开发语言·python·chatgpt
serve the people9 分钟前
神经网络中梯度计算求和公式求导问题
神经网络·算法·机器学习
闻缺陷则喜何志丹15 分钟前
【二分查找、滑动窗口】P10389 [蓝桥杯 2024 省 A] 成绩统计|普及+
c++·算法·蓝桥杯·二分查找·滑动窗口·洛谷·成绩
zy_destiny17 分钟前
【YOLOv12改进trick】三重注意力TripletAttention引入YOLOv12中,实现遮挡目标检测涨点,含创新点Python代码,方便发论文
网络·人工智能·python·深度学习·yolo·计算机视觉·三重注意力
大数据追光猿19 分钟前
【大模型技术】LlamaFactory 的原理解析与应用
人工智能·python·机器学习·docker·语言模型·github·transformer
Start_Present31 分钟前
Pytorch 第七回:卷积神经网络——VGG模型
pytorch·python·神经网络·cnn·分类算法
朴拙数科31 分钟前
1:1精准还原!用Python+Adobe Acrobat DC实现PDF转Word全自动化
python·pdf·word
supermodule32 分钟前
基于flask的一个数据展示网页
后端·python·flask
范哥来了33 分钟前
python文本处理pdfminer库安装与使用
linux·开发语言·python