新冠病毒的传播

题目描述

最近新冠病毒疫情非常严重,由于我们国家采取了有力的措施,才没有使疫情进一步的扩大。今天,作为计算机专业的学生,我们来用程序模拟一下各种情况下的新冠病毒传播情况。现在给定一个n * m的网格,每个网格可以有以下三个值之一:
值 0 代表隔离带。
值 1 代表健康人群。
值 2 代表感染人群。
每天,任何与感染人群(在 4 个正方向上)相邻的健康人都会感染。如果遇到隔离带,病毒就会被阻断。
输出直到单元格中没有健康人为止所必须经过的最小天数。如果不可能所有人都被感染,输出 -1。

输入

测试数据由多组测试样例组成。第一行输入两个正整数 n ( 1 <= n <= 500 ) 和 m ( 1 <= m <= 500 ),
接下来输入n * m个数字,数字均由 0 , 1 ,2构成

输出

每组测试样例,输出直到单元格中没有健康人为止所必须经过的最小天数。如果不可能,输出 -1。

样例输入

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

样例输出

4
-1
0

#include 
using namespace std;
int n,m;
int Map[505][505];
int vis[505][505];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct node{
	int x;
	int y;
}s,s1;
queue<node> p;
//判断数组是否越界
bool ok(int x,int y){
	if(x>=0 && x<n && y>=0 && y<m)
		return true;
	return false;
}
int bfs(){
	int ans=-1;
	while(!p.empty())
	{ 
		ans++;
		int len = p.size();
		for(int j=0; j<len; j++)//同一天感染的人
		{
			s1 = p.front();
			int x = s1.x;
			int y = s1.y;
			p.pop();
			for(int i=0; i<4; i++)//4个方向进行感染
			{
			int tx = x+dir[i][0];
			int ty = y+dir[i][1];
				if(ok(tx,ty) && vis[tx][ty] != 1 && Map[tx][ty] != 0)
				{
					Map[tx][ty] = 2;
					vis[tx][ty] = 1;
					s.x = tx;
					s.y = ty;
					p.push(s);
				}
			}
		}
		
	}
	return ans;
}
int main(){
	while(cin>>n>>m)
	{
		int cnt = 0,a,flag=0; 
		while(p.size() != 0)
			p.pop();
		memset(vis,0,sizeof(vis));
		for(int i=0; i<n; i++)
		{
			for(int j=0; j<m; j++)
			{
				cin>>Map[i][j];
				if(Map[i][j] == 2)
				{
					s.x = i;
					s.y = j;
					vis[i][j] = 1;
					p.push(s);
				}
				if(Map[i][j] == 0) cnt++;
			}
		}
		a = p.size();
		int ans = bfs();
		if(a+cnt == n*m) cout<<0<<endl;
		else
		{
			for(int i=0; i<n; i++)
				for(int j=0; j<m; j++)
					if(Map[i][j] == 1) flag = 1;
					//是否还存在未感染的人群 
			if(flag) cout<<-1<<endl;
			else if(!flag) cout<<ans<<endl;
		}
	}
	return 0;
} 

你可能感兴趣的:(新冠病毒的传播)