病毒扩散
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 25 Solved: 7
[ 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
//简单广搜一道水题,其实就是按照优先级走就可以。我这里优先级用time表示
# include <iostream>
# include <set>
# include <map>
# include <vector>
# include <numeric>
# include <deque>
# include <vector>
# include <algorithm>
# include <stack>
# include <queue>
# include <cstdio>
# include <cstring>
using
namespace
std;
struct
node
{
int
x, y;
int
time
;
};
int
dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
queue<node> q;
int
n, m;
char
ch[105][105];
int
t = 0;
void
bfs()
{
struct
node flag, temp;
//如果我队出完了说明就走完了
while
(!q.empty())
{
//出队
temp = q.front();
if
(t < temp.
time
)
{
t = temp.
time
;
}
q.pop();
//四个方向搜索然后判断,把符号条件的入队
for
(
int
i = 0; i < 4; i++)
{
flag.x = temp.x + dir[i][0];
flag.y = temp.y + dir[i][1];
if
(flag.x < 0 || flag.x >=n || flag.y < 0 || flag.y >= m || ch[flag.x][flag.y] ==
'*'
)
continue
;
//这里是上一步的时间加1
flag.
time
= temp.
time
+ 1;
q.push(flag);
//走完以后就标记一下防止重走
ch[flag.x][flag.y] =
'*'
;
}
}
}
int
main(
int
argc,
char
*argv[])
{
while
(cin >> n >> m)
{
int
flag = 0;
t = 0;
while
(!q.empty())
{
q.pop();
}
for
(
int
i = 0; i < n; i++)
{
cin >> ch[i];
}
struct
node temp;
for
(
int
i = 0; i < n; i++)
{
for
(
int
j = 0; j < m; j++)
{
//这里把初始病毒找到优先级是最高的是第一起点然后入队,然后把这个地方标记走过
if
(ch[i][j] ==
'x'
)
{
flag = 1;
temp.x = i;
temp.y = j;
temp.
time
= 0;
q.push(temp);
ch[i][j] =
'*'
;
}
}
}
bfs();
if
(flag)
{
cout << t << endl;
}
else
{
cout << -1 << endl;
}
}
return
0;
}