zoukankan      html  css  js  c++  java
  • 流感传染

    【题目描述】

    有一批易感人群住在网格状的宿舍区内,宿舍区为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.
  • 相关阅读:
    Java-ThreadLocal,Java中特殊的线程绑定机制
    java-结合c3p0封装的db 事务 类
    java-事务
    java-jdbc循环设置sql参数
    java-BeanUtils介绍及其使用
    java-el+jstl+jsbc综合示例
    Ajax-jQuery_Ajax_实例 ($.ajax、$.post、$.get)
    各种容器与服务器的区别与联系:Servlet容器、WEB容器、Java EE容器、应用服务器、WEB服务器、Java EE服务器
    Tomcat是什么:Tomcat与Java技、Tomcat与Web应用以及Tomcat基本框架及相关配置
    全面理解Java内存模型(JMM)
  • 原文地址:https://www.cnblogs.com/Hello-world-hello-lazy/p/13580867.html
Copyright © 2011-2022 走看看