流感传染

【题目描述】

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

【输入】

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100。

【输出】

输出第m天,得流感的人数。

【输入样例】

5
....#
.#.@.
.#@..
#....
.....
4

【输出样例】

16

#include <iostream>

#include <cstdio>

using namespace std;

char a[105][105];  //存放房间信息

int n, m, b[105];  //b数组用来储存患病人数

int c[105][105];  //标记数组

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

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

void fun()

{

    for(int i=1;i<=m;i++)  //m天

    {

        int sum=0;

        for(int j=1;j<=n;j++)  

        {                      

            for(int p=1;p<=n;p++)

            {

                if(a[j][p]=='@')        //先统计患病的人数

                {

                    sum++;

                    c[j][p]=1;      //用来标记是否是昨天患病的人(如果不标记,按照下面的步骤,刚被传染的人也会取传染别人)

                }

            }

        }

        b[i]=sum;

        for(int j=1;j<=n;j++)

        {

            for(int p=1;p<=n;p++)

            {

                if(c[j][p]==1)    //已经具有传染能力(超过一天的)

                {

                    for(int o=0;o<4;o++)      

                        if(j+dx[o]>=1 && j+dx[o]<=n && p+dy[o]>=1 && p+dy[o]<=n && a[j+dx[o]][p+dy[o]]!='#')

                        //满足还在范围之内并且不是空房间

                            a[j+dx[o]][p+dy[o]]='@';    //传染

                }

            }

        }

    }

}

int main()

{

    cin>>n;

    for(int i=1;i<=n;i++)

        cin>>&a[i][1];    //注意这里输入的初始的地址

    cin>>m;

    fun();

    for(int i=1;i<=m;i++)

        cout<<b[i]<<" ";

    cout<<endl;

    for(int i=1;i<=n;i++)

    {

        for(int j=1;j<=n;j++)

            cout<<a[i][j];

        cout<<endl;

    }

    return 0;

}

注释:第一次做这个题目的时候,犯了一个严重的错误:没有用数组去标记@,导致刚被传染成@的立马又去传染新的人。

之后采用了先标记,后传染,就很好地解决了“隔一天才能传染”的问题。

这篇文章,是又一个故事的结束...
lazy's story is continuing.
原文地址:https://www.cnblogs.com/Hello-world-hello-lazy/p/13580867.html