csuoj-1726-你经历过绝望吗?两次!

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;
}


你可能感兴趣的:(csuoj-1726-你经历过绝望吗?两次!)