Description
4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活。当地15名消防员耗时一天解救围困的“猪坚强”。不过与在废墟中靠吃木炭饮雨水存活36天的中国汶川“猪坚强”相比,熊本的猪可没那么幸运,因为它们最终还是没能逃过被送往屠宰场的命运。
我们假设“猪坚强”被困在一个N*M的废墟中,其中“@”表示“猪坚强”的位置,“.”表示可以直接通过的空地,“#”表示不能拆毁的障碍物,“*”表示可以拆毁的障碍物,那么请问消防员至少要拆毁多少个障碍物,才能从废墟中救出“猪坚强”送往屠宰场?(当“猪坚强”通过空地或被拆毁的障碍物移动到废墟边缘时,视作被救出废墟)
Input
多组数据,第一行有一个整数T,表示有T组数据。(T<=100)
以下每组数据第一行有两个整数N和M。(1<=N,M<=100)
接着N行,每行有一个长度为M的字符串。
Output
一个整数,为最少拆毁的障碍物数量,如果不能逃离废墟,输出-1。
Sample Input
3
3 3
###
#@*
***
3 4
####
#@.*
**.*
3 3
.#.
#@#
.#.
Sample Output
1
0
-1
HINT
裸的bfs的模板题
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
char mat[maxn][maxn];
bool flag[maxn][maxn];
int n, m;
struct node{
int x, y;
int step;
bool operator < (const node & p) const{
return step > p.step;
}
};
int bfs(int x, int y){
priority_queue<node> que;
node p;
p.x = x;
p.y = y;
p.step = 0;
que.push(p);
while (!que.empty()){
p = que.top();
que.pop();
x = p.x;
y = p.y;
int step = p.step;
if (x==0 || y==0 || x==n-1 || y==m-1)
return step;
node pp;
for (int i=0; i<4; ++i){
pp.x = x+dir[i][0];
pp.y = y+dir[i][1];
pp.step = 0;
if (pp.x>=0 && pp.x<n && pp.y>=0 && pp.y<m){
if (mat[pp.x][pp.y] == '*')
pp.step = step+1;
else if (mat[pp.x][pp.y] == '.')
pp.step = step+0;
else
pp.step = -1;
if (pp.step>=0 && flag[pp.x][pp.y]==false){
flag[pp.x][pp.y] = true;
que.push(pp);
}
}
}
}
return -1;
}
int main(){
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int T;
scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &m);
for (int i=0; i<n; ++i)
scanf("%s", mat+i);
int ta, tb;
memset(flag, false, sizeof(flag));
for (int i=0; i<n; ++i)
for (int j=0; j<m; ++j){
if (mat[i][j] == '@'){
ta = i;
tb = j;
}
}
flag[ta][tb] = true;
int ans = bfs(ta, tb);
printf("%d\n", ans);
}
return 0;
}