流感传染
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1191时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
【输入】
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100。
【输出】
输出第m天,得流感的人数。
【输入样例】
5 ....# .#.@. .#@.. #.... ..... 4
【输出样例】
16
#include<iostream> #include<cstdio> #include<string> #include<queue> using namespace std; struct node{ int x,y,num; }; queue <node> Q; char a[105][105]; int mp[105][105]; int p[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; int n,t; void dfs(int t){ while(!Q.empty()) { node now=Q.front();Q.pop(); for(int i=0;i<4;i++) { node s; s.x=now.x+p[i][0]; s.y=now.y+p[i][1]; s.num=now.num+1; if(s.num>t)return; if(s.x>0&&s.x<=n&&s.y>0&&s.y<=n&&mp[s.x][s.y]==0) { mp[s.x][s.y]=1; Q.push(s); } } } } int main() { int cnt=0,k=0; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>a[i][j]; if(a[i][j]=='#')mp[i][j]=-1; if(a[i][j]=='@') { mp[i][j]=1; node s; s.x=i;s.y=j;s.num=1; Q.push(s); } } cin>>t; dfs(t); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(mp[i][j]==1)cnt++; cout<<cnt<<endl; }