题目:流感传染
题目描述
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入输出格式
输入格式:
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100。
输出格式:
输出第m天,得流感的人数。
输入输出样例
输入样例:
5
....#
.#.@.
.#@..
#....
.....
4
输出样例:
16
我们很快就想到用循环把每天被传染的人进行标记,但是运行后我们发现每一次只要一两天就把所有人感染了,因为被感染的人标记后,程序又将它进行传染,重复了。
怎么办呢,很多人想到用两个数组。其实不用,只要用-1,0,1分别表示空的,昨天被感染的,和今天被感染的。这就节省了内存。
注意事项:应为题目说“以后每天,得流感的人会使其邻居传染上流感,”,所以天数一定要减1!
代码如下:比较长
#include<iostream>
#include<cstdio>
using namespace std;
long long sum=0;
int n,m,a[110][110],i,j;
char a1;
int main()
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>a1;
if(a1=='.')
a[i][j]=0;
if(a1=='@')
a[i][j]=1;
if(a1=='#')
a[i][j]=-1;
}
cin>>m;
while(m>1)
{
m--;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[i][j]==1)
{
if(a[i+1][j]==0)
a[i+1][j]=2;
if(a[i-1][j]==0)
a[i-1][j]=2;
if(a[i][j+1]==0)
a[i][j+1]=2;
if(a[i][j-1]==0)
a[i][j-1]=2;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==2)
a[i][j]=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]==1)
sum++;
}
}
cout<<sum;
return 0;
}