流感传染
作者:互联网
【题目描述】
有一批易感人群住在网格状的宿舍区内,宿舍区为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;
}
注释:第一次做这个题目的时候,犯了一个严重的错误:没有用数组去标记@,导致刚被传染成@的立马又去传染新的人。
之后采用了先标记,后传染,就很好地解决了“隔一天才能传染”的问题。
标签:cout,int,房间,传染,流感,105 来源: https://www.cnblogs.com/Hello-world-hello-lazy/p/13580867.html