计算疫情扩散时间
一.题目
二.歧义
此题没有歧义
三.解题思路
这道题剔除一些无关简要的代码,就是一个循环就搞定了。
四.代码
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卷答案