广搜系列(病毒扩散)

 病毒扩散

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 25  Solved: 7
[ Submit][ Status][ Web Board]

Description

在一个 N * M 的方格中,有一些位置是病毒所在位置,每一秒钟,每一个病毒都会向四个方向同时扩散,扩散出去的病毒还会以相同的方式继续扩散....好可怕啊,那么最少几秒钟病毒源就可以将整个方格都扩散? 

Input

题目数据有多组,请读入至文件结束。

每组有两个正整数N,M(1<=N,M<=100)。代表该区域格阵的行、列数。

之后有N行,每行M个字符,作为区域的描述。其中'.'代表该点为空,'x'代表该点有病毒存在。

Output

输出一个整数,即病毒占满整个区域时所需要的时间。若一直无法占满,则输出"-1"。每组输出占一行。

Sample Input

3 4..x........x

Sample Output

3

HINT

//简单广搜一道水题,其实就是按照优先级走就可以。我这里优先级用time表示

# include <iostream>
# include <set>
# include <map>
# include <vector>
# include <numeric>
# include <deque>
# include <vector>
# include <algorithm>
# include <stack>
# include <queue>
# include <cstdio>
# include <cstring>
 
using namespace std;
 
struct node
{
     int x, y;
     int time ;
};
 
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
queue<node> q;
 
int n, m;
char ch[105][105];
 
int t = 0;
void bfs()
{
 
   struct node flag, temp;
//如果我队出完了说明就走完了
   while (!q.empty())
   {
//出队
       temp = q.front();
       if (t < temp. time )
       {
         t = temp. time ;
       }
       q.pop();
//四个方向搜索然后判断,把符号条件的入队
     for ( int i = 0; i < 4; i++)
     {
         flag.x = temp.x + dir[i][0];
         flag.y = temp.y + dir[i][1];
         if (flag.x < 0 || flag.x >=n || flag.y < 0 || flag.y >= m || ch[flag.x][flag.y] == '*' )
             continue ;
//这里是上一步的时间加1
         flag. time = temp. time + 1;
         q.push(flag);
//走完以后就标记一下防止重走
         ch[flag.x][flag.y] = '*' ;
     }
   }
}
 
int main( int argc, char *argv[])
{
 
     while (cin >> n >> m)
     {
         int flag = 0;
         t = 0;
         while (!q.empty())
         {
             q.pop();
         }
 
         for ( int i = 0; i < n; i++)
         {
             cin >> ch[i];
         }
         struct node temp;
         for ( int i = 0; i < n; i++)
         {
             for ( int j = 0; j < m; j++)
             {
//这里把初始病毒找到优先级是最高的是第一起点然后入队,然后把这个地方标记走过
                 if (ch[i][j] == 'x' )
                 {
                     flag = 1;
                     temp.x = i;
                     temp.y = j;
                     temp. time = 0;
                     q.push(temp);
                     ch[i][j] = '*' ;
                 }
             }
         }
         bfs();
         if (flag)
         {
             cout << t << endl;
         }
         else
         {
             cout << -1 << endl;
         }
     }
 
 
     return 0;
}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文基于传统的传染病模型,以微分方程的方法作为理论基础,结合采取的措施不同的情况,用MATLAB软件拟合出患者人数与时间的曲线关系,从中得出应采取的相应的应对措施。 在考虑地区总人数不变,人群被分为五类:确诊患者、疑似患者、治愈者、死亡和正常人,再将这几类分为可传染性和不可传染性两种。我们找出单位时间内正常人数的变化、单位时间内潜伏期病人数的变化、单位时间内确诊患者人数的变化、单位时间内退出的人数的变化、单位时间内疑似患者人数的变化等关系建立微分方程模型,得到病毒扩散与传播的控制模型。 在此基础上,我们将所要求的问题带入模型得到患者人数随时间变化的曲线图,根据这图形得出模型结果的变化。这样一来就可根据这结果的变化得出相应的应对措施。 此外对该传染病的潜伏期及治愈期进行了灵敏度分析,发现潜伏期的变化会对整个模型的结果产生较大影响,而治愈期的变化只会使传染病的持续时间缩短,但对累积的患病人数影响不大。 应尽量避免患者与正常人接触,减少正常人患病的可能性;加大隔离措施强度;减少拖延患者去住院的时间,让患者及时住院治疗。养成良好的卫生习惯,保证科学睡眠,适当锻炼,减少压力,保证营养,增强个人抵抗力,降低被病毒感染的危险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值