计算疫情扩散时间

一.题目

二.歧义

此题没有歧义

三.解题思路

这道题剔除一些无关简要的代码,就是一个循环就搞定了。

四.代码

1.主函数

先上主流程

  • 因为题目中说了,输入的数据是以“,”分隔,所以上来就是分割
  • 对生产出来的数据进行校验
  • 根据用户输入的数据 初始化地图信息
  • 校验是否全部感染 或者 全部没有被感染
  • 计算感染时间
void main()
{
    std::string str;
    std::string reg = ",";
    std::getline(std::cin, str);
    std::vector<int> nums = SplitStringToDigit(str, reg);

    if (nums.empty())
    {
        std::cout << "-1" << std::endl;
        return;
    }
    int n = std::sqrt(nums.size());
    //根据用户输入的数据 初始化地图信息
    InitMap(nums, n);
    //校验是否全部感染 或者 全部没有被感染
    if (IsAllInfect(n) || IsAllNoInfect(n))
    {
        std::cout << "-1" << std::endl;
        return;
    }
    std::cout << CalcInfectDays(n) << std::endl;

}

2.分割

因为题目中说了,输入的数据是以“,”分隔,所以必然还是老代码

//分隔字符串并将其转换为数字
std::vector<int> SplitStringToDigit(std::string& str, const std::string& reg)
{
    std::vector<int> result;
    std::string::size_type posLast = 0;
    std::string::size_type posCurrent = str.find(reg);

    while (posCurrent != std::string::npos)
    {
        result.push_back(str.substr(posLast, posCurrent - posLast).c_str()[0] - '0');
        posLast = posCurrent + reg.size();
        posCurrent = str.find(reg, posLast);
    }

    if (posLast < str.length())
    {
        result.push_back(str.substr(posLast).c_str()[0] - '0');
    }
    return result;
}

3.初始化地图

//根据输入的数据初始化map
void InitMap(const std::vector<int>& nums,int n)
{
    for (int i = 0; i < nums.size(); i++)
    {
        int row = i / n;
        int cell = i % n;
        map[row][cell] = nums[i];
    }
}

4.核心代码

//获取所有被感染的节点
std::vector<std::pair<int, int>> GetInfectNodes(int n)
{
    //获取所有被感染的节点
    std::vector<std::pair<int, int>> infectNodes;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            //0 没有被感染, 1被感染
            if (map[i][j] == 1)
            {
                infectNodes.push_back(std::make_pair(i, j));
            }
        }
    }
    return infectNodes;
}

int CalcInfectDays(int n)
{
    std::vector<std::pair<int, int>> infectNodes = GetInfectNodes(n);
    int days = 0;
    while (!IsAllInfect(n))
    {
        //病毒可以一传百,百传千,这里一定要重新获取病毒源
        infectNodes = GetInfectNodes(n);
        for (auto& node : infectNodes)
        {
            for (auto& dir : directions)
            {
                int row = node.first + dir[0];
                int cell = node.second + dir[1];
                //如果超越n的边界了,就不处理
                if (row < 0 || row >= n || cell < 0 || cell >= n) 
                    continue;
                map[row][cell] = 1;
            }
        }
        days++;
    }
    return days;
}

五.全部代码

#include <iostream>
#include <vector>
#include <cmath>
#include <string>


//分隔字符串并将其转换为数字
std::vector<int> SplitStringToDigit(std::string& str, const std::string& reg)
{
    std::vector<int> result;
    std::string::size_type posLast = 0;
    std::string::size_type posCurrent = str.find(reg);

    while (posCurrent != std::string::npos)
    {
        result.push_back(str.substr(posLast, posCurrent - posLast).c_str()[0] - '0');
        posLast = posCurrent + reg.size();
        posCurrent = str.find(reg, posLast);
    }

    if (posLast < str.length())
    {
        result.push_back(str.substr(posLast).c_str()[0] - '0');
    }
    return result;
}



//由于题目限定了地图的最大范围,这里设定一个最大二维数组
int map[200][200];
int directions[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };

//根据输入的数据初始化map
void InitMap(const std::vector<int>& nums,int n)
{
    for (int i = 0; i < nums.size(); i++)
    {
        int row = i / n;
        int cell = i % n;
        map[row][cell] = nums[i];
    }
}

//校验地图是否全部被感染了
bool IsAllInfect(int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            //0 没有被感染, 1被感染
            if (map[i][j] == 0) return false;
        }
    }
    return true;
}

//校验地图是否全部没有被感染
bool IsAllNoInfect(int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            //0 没有被感染, 1被感染
            if (map[i][j] == 1) return false;
        }
    }
    return true;
}

//获取所有被感染的节点
std::vector<std::pair<int, int>> GetInfectNodes(int n)
{
    //获取所有被感染的节点
    std::vector<std::pair<int, int>> infectNodes;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            //0 没有被感染, 1被感染
            if (map[i][j] == 1)
            {
                infectNodes.push_back(std::make_pair(i, j));
            }
        }
    }
    return infectNodes;
}

int CalcInfectDays(int n)
{
    std::vector<std::pair<int, int>> infectNodes = GetInfectNodes(n);
    int days = 0;
    while (!IsAllInfect(n))
    {
        //病毒可以一传百,百传千,这里一定要重新获取病毒源
        infectNodes = GetInfectNodes(n);
        for (auto& node : infectNodes)
        {
            for (auto& dir : directions)
            {
                int row = node.first + dir[0];
                int cell = node.second + dir[1];
                //如果超越n的边界了,就不处理
                if (row < 0 || row >= n || cell < 0 || cell >= n) 
                    continue;
                map[row][cell] = 1;
            }
        }
        days++;
    }
    return days;
}





void DebugTest()
{
    std::vector<int> nums = { 1,0,1,0,0,0,1,0,1 };
    int n = std::sqrt(nums.size());
    InitMap(nums, n);
    if (IsAllInfect(n) || IsAllNoInfect(n))
    {
        std::cout << "-1" << std::endl;
        return;
    }
    std::cout << CalcInfectDays(n) << std::endl;
}



void main()
{
    std::string str;
    std::string reg = ",";
    std::getline(std::cin, str);
    std::vector<int> nums = SplitStringToDigit(str, reg);

    if (nums.empty())
    {
        std::cout << "-1" << std::endl;
        return;
    }
    int n = std::sqrt(nums.size());
    //根据用户输入的数据 初始化地图信息
    InitMap(nums, n);
    //校验是否全部感染 或者 全部没有被感染
    if (IsAllInfect(n) || IsAllNoInfect(n))
    {
        std::cout << "-1" << std::endl;
        return;
    }
    std::cout << CalcInfectDays(n) << std::endl;

}

华为OD2024 E 文章被收录于专栏

实时更新华为2024 E卷答案

全部评论

相关推荐

点赞 评论 收藏
分享
01-02 21:17
已编辑
西安理工大学 后端
程序员小白条:项目不太重要,你的优势的算法竞赛,然后多背相关的八股文,项目可以不作为重点考虑,面试可能就简单带过项目就行了,你可以直接写简历,背项目相关的八股文就行,也不用自己做,时间紧张的情况下,性价比最高
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14081次浏览 182人参与
# 面试被问“你的缺点是什么?”怎么答 #
6309次浏览 98人参与
# 水滴春招 #
16260次浏览 346人参与
# 入职第四天,心情怎么样 #
11280次浏览 63人参与
# 租房找室友 #
8005次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26151次浏览 356人参与
# 职场新人生存指南 #
199185次浏览 5509人参与
# 参加完秋招的机械人,还参加春招吗? #
26960次浏览 276人参与
# 文科生还参加今年的春招吗 #
4101次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48619次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144708次浏览 829人参与
# 如果重来一次你还会读研吗 #
155714次浏览 1706人参与
# 机械人选offer,最看重什么? #
69076次浏览 449人参与
# 选择和努力,哪个更重要? #
44269次浏览 492人参与
# 如果再来一次,你还会学硬件吗 #
103643次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20519次浏览 413人参与
# 招聘要求与实际实习内容不符怎么办 #
46703次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901211次浏览 8960人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81371次浏览 496人参与
# 国企还是互联网,你怎么选? #
109189次浏览 853人参与
牛客网
牛客企业服务