题目描述
最近新冠病毒疫情非常严重,由于我们国家采取了有力的措施,才没有使疫情进一步的扩大。今天,作为计算机专业的学生,我们来用程序模拟一下各种情况下的新冠病毒传播情况。现在给定一个n * m的网格,每个网格可以有以下三个值之一:
值 0 代表隔离带。
值 1 代表健康人群。
值 2 代表感染人群。
每天,任何与感染人群(在 4 个正方向上)相邻的健康人都会感染。如果遇到隔离带,病毒就会被阻断。
输出直到单元格中没有健康人为止所必须经过的最小天数。如果不可能所有人都被感染,输出 -1。
输入
测试数据由多组测试样例组成。第一行输入两个正整数 n ( 1 <= n <= 500 ) 和 m ( 1 <= m <= 500 ),
接下来输入n * m个数字,数字均由 0 , 1 ,2构成
输出
每组测试样例,输出直到单元格中没有健康人为止所必须经过的最小天数。如果不可能,输出 -1。
样例输入 Copy
3 3
2 1 1
1 1 0
0 1 1
3 3
2 1 1
0 1 1
1 0 1
1 2
0 2
样例输出 Copy
4
-1
0
思路:
每次找到感染者,然后扩散四周(不能超过边界,是没有得病的人)
fx.x >= 0 && fx.x < n && fx.y >= 0 && fy.y < m && a [ fx.x ] [ fx.y ] == 1 ;
简单的bfs题目。。。。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,s,f,maxs;
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int a[505][505];
int b[505][505];
struct ma{
int x;
int y;
int s;
}w;
queue<ma>q;
int main(){
while(cin>>n>>m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
if(a[i][j]==2){
w.x=i;
w.y=j;
w.s=0;
q.push(w);
}
}
}
maxs=0;
while(!q.empty()){
ma fx,fy;
fx=q.front();
q.pop();
if(maxs<fx.s)maxs=fx.s;
for(int i=0;i<4;i++){
fx.x+=d[i][0];
fx.y+=d[i][1];
if(fx.x>=0&&fx.x<n&&fx.y>=0&&fy.y<m&&a[fx.x][fx.y]==1){
a[fx.x][fx.y]=2;
fx.s++;
q.push(fx);
fx.s--;
}
fx.x-=d[i][0];
fx.y-=d[i][1];
}
}
f=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]==1){
f=1;
}
}
}
if(f==1){
cout<<-1<<endl;
}else{
cout<<maxs<<endl;
}
}
return 0;
}