CSUST选拔赛题解之-Problem H: 逃出监狱

Problem H: 逃出监狱

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 116   Solved: 42
[ Submit][ Status][ Web Board]

Description

给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表障碍物不能走,
'A'代表小偷,'B'代表警察,'E'代表出口。每个位置可以向(上,下,左,
右)四个方向走一格,花费一个单位时间,现在给出小偷,警察和出口所在
位置,警察为了捉住小偷会先到出口的位置守株待兔,如果警察在小偷之前
或同时到达出口,或者小偷到达不了出口,输出"No",否则输出"Yes"。

Input

第一行一个整数T(T<=50),代表数据的组数
接下来一行n,m(n<=500,m<=500),代表图的行和列
接下来n行,每行为长度为m的字符串,组成一张图

Output

每行输出"Yes"或"No"

Sample Input

2
5 5
....A
##...
E#..B
##...
.....
5 5
A....
.....
B....
...E.
.....

Sample Output

No
No

HINT

解题思路:bfs模板题,直接上代码吧。
AC代码:
#include
#include
#include
#include
#include
#include
#include
#define N 50000
 
using namespace std;
 
int _map[510][510], vis[510][510];
int n, m;
int dirx[4] = {0,-1,0,1};
int diry[4] = {1,0,-1,0};
int xx, xy, jx, jy, endx, endy, x, j;
char str[510];
 
struct node
{
    int x;
    int y;
    int lenth;
};
 
bool can_go(int x, int y)
{
    if(x < 0 || y < 0 || x >= n || y >= m)
        return false;
    if(_map[x][y])
        return false;
    return true;
}
 
int bfs(int x, int y)
{
    memset(vis, 0, sizeof(vis));
    queue q;
    node start;
    start.x = x;
    start.y = y;
    start.lenth = 0;
    q.push(start);
    while(!q.empty())
    {
        node cur;
        cur = q.front();
        if(cur.x == endx && cur.y == endy){
            return cur.lenth;
        }
        q.pop();
        for(int i = 0; i < 4; i ++)
        {
            node next;
            next.x = cur.x + dirx[i];
            next.y = cur.y + diry[i];
            next.lenth = cur.lenth + 1;
            if(can_go(next.x, next.y))
            {
                if(vis[next.x][next.y]) continue;
                vis[next.x][next.y] = 1;
                q.push(next);
            }
        }
    }
    return -1;
}
 
int main()
{
    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%d%d", &n, &m);
        memset(_map, 0, sizeof(_map));
        for(int i = 0; i < n; i ++){
            scanf("%s", str);
            for(int j = 0; j < m; j ++){
                if(str[j] == '#'){
                    _map[i][j] = 1;
                }
                if(str[j] == 'A'){
                    xx = i;
                    xy = j;
                }
                if(str[j] == 'B'){
                    jx = i;
                    jy = j;
                }
                if(str[j] == 'E'){
                    endx = i;
                    endy = j;
                }
            }
        }
        x = bfs(xx, xy);
        j = bfs(jx, jy);
        if(x == -1){
            printf("No\n");continue;
        }
        if(j <= x) printf("No\n");
        else printf("Yes\n");
    }
 
    return 0;
}

你可能感兴趣的:(鶸鹡的选拔赛题解)