病毒扩散
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 29 Solved: 10
[ Submit][ Status][ Web Board]
Description
在一个 N * M 的方格中,有一些位置是病毒所在位置,每一秒钟,每一个病毒都会向四个方向同时扩散,扩散出去的病毒还会以相同的方式继续扩散....好可怕啊,那么最少几秒钟病毒源就可以将整个方格都扩散?
Input
题目数据有多组,请读入至文件结束。
每组有两个正整数N,M(1<=N,M<=100)。代表该区域格阵的行、列数。
之后有N行,每行M个字符,作为区域的描述。其中'.'代表该点为空,'x'代表该点有病毒存在。Output
输出一个整数,即病毒占满整个区域时所需要的时间。若一直无法占满,则输出"-1"。每组输出占一行。
Sample Input
3 4..x........x
Sample Output
3
HINT
Source
# include <iostream>
# include <queue>
using namespace std;
//建立一个结构体把病毒的坐标和第几次产生标记
struct node
{
int x, y;
int time;
};
queue<struct node> q;
char mm[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;
}
//四个方向的比较
//temp是前一步,flag是走完的一步注意flag的时间是temp + 1
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 ||
mm[tx][ty] == '*')
continue;
flag.x = tx;
flag.y = ty;
flag.time = temp.time + 1;
q.push(flag);
//走完之后记得标记防止重复走
mm[tx][ty] = '*';}
}
}
int main(int argc, char *argv[])
{
while(cin >> n >> m)
{
int flag = 0;
t = 0;
for(int i = 0; i < n; i++)
{
cin >> mm[i];
}
struct node temp;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
//找病毒位置并且入队
if(mm[i][j] == 'x'){
flag = 1;
temp.x = i;
temp.y = j;
temp.time = 0;
q.push(temp);
mm[i][j] = '*';
}
}
}
bfs();
if(flag)
{
cout << t << endl;
}
else
{
cout << -1 << endl;
}
}
return 0;
}