1191:流感传染

Posted tflsnoi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1191:流感传染相关的知识,希望对你有一定的参考价值。

题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1191

此题做题思路:这个题考查模拟矩阵的搜索过程。用字符二维数组存放网格状的宿舍区,用

int next[4][4]={{0,1},{1,0},{-1,0},{0,-1}};

来模拟感染四个方向。于是大概5m后出现如下代码:

#include<iostream>
using namespace std;
char a[101][101];
int n, m, cnt=0;
int next[4][4]={{0,1},{1,0},{-1,0},{0,-1}};//四个方向感染
void gr(int x, int y)//该函数为感染函数
{
    int dx, dy;
    for(int i=0; i<4; i++)//依次对上下左右进行判断
    {
        dx=x+next[i][0];
        dy=y+next[i][1];
        if(dx>0 && dx<=n && dy>0 && dy<=n && a[dx][dy]==.)//如果没有越界,并且当前住着没有被感染的病人
        {
            a[dx][dy]=@;//符合上述条件感染
            cnt++;//感染数加1
        }        
    }
}
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            cin>>a[i][j];
        }        
    cin>>m;
    for(int k=2; k<=m; k++)
    {
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                if(a[i][j]==@)gr(i,j);//如果当前为@调用gr()函数
            }
                
    }            
    cout<<cnt<<endl;
    return 0;
}

结果运行如下:

技术分享图片

样例显然不对,发生了什么事情?为了查出错误在什么地方,在第37行之后增加如下代码

1     for(int i=1; i<=n; i++)
2     {
3         for(int j=1; j<=n; j++)
4                 cout<<a[i][j]<<" ";
5                 cout<<endl;
6     }

并且输入m=2表示观察一下经过第二天感染后病毒人数是多少,发现感染数显然不对,原因是使用双重循环遍历房间时,如调用gr函数去感染第i行时,其实第i+1行也被感染,再去感染第i+1行时就包含了同一天已被感染的人。所以我这儿用另外一个数组aa[][]将当前感染立马存储,便 有了如下代码:

 1 #include<iostream>
 2 using namespace std;
 3 char a[101][101], aa[101][101];//a数组用于存放上一天的感染情况,aa数组用于存放当天被感染情况。
 4 int n, m, cnt=0;
 5 int next[4][4]={{0,1},{1,0},{-1,0},{0,-1}};
 6 void gr(int x, int y)
 7 {
 8     int dx, dy;
 9     for(int i=0; i<4; i++)
10     {
11         dx=x+next[i][0];
12         dy=y+next[i][1];
13         if(dx>0 && dx<=n && dy>0 && dy<=n && a[dx][dy]==.)//注意这里是判断a数组
14         {
15             aa[dx][dy]=@;//注意这里是aa数组
16         }        
17     }
18 }
19 int main()
20 {
21     cin>>n;
22     for(int i=1; i<=n; i++)
23         for(int j=1; j<=n; j++)
24         {
25             cin>>a[i][j];
26             aa[i][j]=a[i][j];
27         }        
28     cin>>m;
29     for(int k=2; k<=m; k++)
30     {
31         for(int i=1; i<=n; i++)
32             for(int j=1; j<=n; j++)
33             {
34                 if(a[i][j]==@)gr(i,j);//这里是根据前一天病毒感染情况来进行感染
35             }
36         for(int i=1; i<=n; i++)//把当天感染结果再赋值给了a数组
37             for(int j=1; j<=n; j++)    
38                 a[i][j]=aa[i][j];
39                 
40     }
41     for(int i=1; i<=n; i++)
42         for(int j=1; j<=n; j++)
43             if(a[i][j]==@)cnt++;
44             
45     cout<<cnt<<endl;
46     return 0;
47 }

代码是长了点,但还是容易理解的!这个题关键是搞清楚数组存储已被感染和待被感染,以及他们之间的关系,其实还是包含最简单的递推思想的!

以上是关于1191:流感传染的主要内容,如果未能解决你的问题,请参考以下文章

漫画:什么是流行病的 R0 和 R ?

“知感冒防流感”全民科普公益行9月10日走进中山

传染病护理学习题

传染病护理学习题

2018

SpEL表达式