题目描述
在一个 N * M 的方格中,有一些位置是病毒所在位置,每一秒钟,每一个病毒都会向四个方向同时扩散,扩散出去的病毒还会以相同的方式继续扩散….好可怕啊,那么最少几秒钟病毒源就可以将整个方格都扩散?
输入格式
题目数据有多组,请读入至文件结束。
每组有两个正整数N,M(1<=N,M<=100)。代表该区域格阵的行、列数。
之后有N行,每行M个字符,作为区域的描述。其中’.’代表该点为空,’x’代表该点有病毒存在。
输出格式
输出一个整数,即病毒占满整个区域时所需要的时间。若一直无法占满,则输出”-1”。每组输出占一行。
输入样例
3 4
…x.
…
…x
输出样例
3
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x;
int y;
int time;
};
queue <struct node> q;
char map[105][105];
int n,m;
int t=0;
int dir[][2]={0,1,0,-1,1,0,-1,0};
void bfs()
{
struct node temp,flag;
while(!q.empty()) //队列为空停止
{
temp=q.front(); //取出队列首元素不删除
flag=temp;
q.pop(); //删除队列首元素
if(t<temp.time) //更新步数
{
t=temp.time;
}
for(int i=0;i<4;i++)
{
int tx=temp.x+dir[i][0];
int ty=temp.y+dir[i][1];
if(tx<0||tx>=n||ty<0||ty>=m||map[tx][ty]=='*')
{
continue;
}
flag.x=tx;
flag.y=ty;
flag.time=temp.time+1;
q.push(flag); //入队
map[tx][ty]='*';
}
}
}
int main()
{
while(cin>>n>>m)
{
int flag=0;
t=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>map[i][j];
}
}
struct node temp;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='x')
{
flag=1;
temp.x=i;
temp.y=j;
temp.time=0;
q.push(temp); //入队
map[i][j]='*';
}
}
}
bfs();
if(flag)
{
cout<<t<<endl;
}
else
{
cout<<-1<<endl;
}
}
return 0;
}