描述
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出
输出第m天,得流感的人数
样例输入
5 ....# .#.@. .#@.. #.... ..... 4
样例输出
16
#include<bits/stdc++.h>
using namespace std;
int main()
{
int b[105][105]={0},i,j,k,n,m,t=0;//b数组是用来存a数组值的(t要给初值)
char a[105][105]={0};//a数组是char类型
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
cin>>m;
for(k=2;k<=m;k++)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]=='@')
{
if(a[i-1][j]=='.')
b[i-1][j]=1;
if(a[i+1][j]=='.')
b[i+1][j]=1;
if(a[i][j-1]=='.')
b[i][j-1]=1;
if(a[i][j+1]=='.')
b[i][j+1]=1;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(b[i][j]==1)a[i][j]='@';
memset(b,0,sizeof(b));//把b数组归0(可以不加)
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]=='@')
t++;
cout<<t<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define N 105
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int main()
{
char mp[N][N], t[N][N];//t:临时数组
int n, m, ct = 0;
cin >> n;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
cin >> mp[i][j];
cin >> m;
for(int k = 2; k <= m; ++k)//第k天如何传染
{
memset(t, 0, sizeof(t));//对t清空。
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
{
t[i][j] = mp[i][j];
if(mp[i][j] == '.')//如果(i,j)没患病,但周围有病人,就会被传染,否则和原来一样。
{
for(int l = 0; l < 4; ++l)
{
int x = i + dir[l][0], y = j + dir[l][1];
if(x >= 1 && x <= n && y >= 1 && y <= n && mp[x][y] == '@')
t[i][j] = '@';
}
}
}
memcpy(mp, t, sizeof(t));//拷贝t到mp
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(mp[i][j] == '@')
ct++;
cout << ct;
return 0;
}