HLG 1613 迷宫问题 (BFS + priority_queue)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1613

Description :

小z身处在一个迷宫中,小z每分钟可以走到上下左右四个方向的相邻格之一。迷宫中有一些墙和障碍物。

同时迷宫中也有一些传送门,当小z走到任意一个传送门时,可以选择传送到其他任意的传送门(传送是不花费时间的),

当然也可以停留在原地。现在小z想知道走出迷宫需要花费的最少时间。

Input :

输入第一行为组数T(t<=10)。

对于每组数据第一行为两个整数R和C(1<=R,C<=100)。以下R行每行有C个字符,即迷宫地图。

其中"#"代表墙和障碍物,"."表示空地,"P"表示传送门,"Z"表示小z的起始位置,"W"表示迷宫出口。

对于每组数据保证起始位置和迷宫出口唯一。

Output :

对于每组数据,输出走出迷宫的最短时间(单位:分钟)。如果无法走出迷宫则输出"IMPOSSIBLE"。

Sample Input :

2

3 4

.Z..

.P#.

##PW

4 4

Z..P

....

##..

W#.P

Sample Output :

2

IMPOSSIBLE

解析:

BFS + priority_queue

代码解析如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <queue>
#include <algorithm>
#define MAXN 205
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

typedef struct _Node
{
    int x, y;
    int step;
}Node;

Node p[MAXN], start;
char Map[MAXN][MAXN];
int v[MAXN][MAXN];
int n, m, res, cas;
int Sx, Sy, Ex, Ey, k;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
priority_queue <Node> pq;

bool operator < (Node a, Node b)
{
    return a.step > b.step;
}

bool check(int x, int y)
{
    return x>=0 && y>=0 && x<n && y<m && Map[x][y]!='#' && !v[x][y];
}

int BFS()
{
    Node cur;
    int px, py, xx, yy, cstep;
    while(!pq.empty()) {
        cur = pq.top(), pq.pop();
        px = cur.x, py = cur.y, cstep = cur.step;
        for(int i=0; i<4; i++) {
            xx = px + dx[i], yy = py + dy[i];
            if(check(xx, yy)) {
                if(xx == Ex && yy == Ey) return cstep+1;
                if(Map[xx][yy] == 'P') {
                    for(int j=0; j<k; j++) {    //飞到另外没有访问过的传送门所在的位置;
                        int fx = p[j].x, fy = p[j].y;
                        if(!v[fx][fy]) {
                            cur.x = fx, cur.y = fy;
                            cur.step = cstep + 1;
                            pq.push(cur);
                        }
                    }
                }else if(Map[xx][yy] == '.') {
                    cur.x = xx, cur.y = yy;
                    cur.step = cstep + 1;
                    pq.push(cur);
                }
                v[xx][yy] = 1;
            }
        }
    }
    return -1;
}

int main()
{
    scanf("%d", &cas);
    while(cas--) {
        scanf("%d %d", &n, &m);
        k = 0;
        for(int i=0; i<n; i++) {
            scanf("%s", Map[i]);
            for(int j=0; j<m; j++) {
                if(Map[i][j] == 'Z') { Sx=i, Sy=j; }
                else if(Map[i][j] == 'W') { Ex=i, Ey=j; }
                else if(Map[i][j] == 'P') {   //记录传送门的位置
                    p[k].x = i, p[k].y = j;
                    p[k++].step = 0;
                }
            }
        }
        RST(v);
        v[Sx][Sy] = 1;
        while(!pq.empty()) pq.pop();
        start.x = Sx, start.y = Sy, start.step = 0;
        pq.push(start);
        res = BFS();
        if(res != -1) printf("%d\n", res);
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}
时间: 2024-10-17 14:27:44

HLG 1613 迷宫问题 (BFS + priority_queue)的相关文章

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

HDU 1728 逃离迷宫(BFS)

Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可

hdu 1175 bfs+priority_queue

连连看 如上图所示如果采用传统bfs的话,如果按照逆时针方向从(1,1)-->(3,4)搜索,会优先选择走拐四次弯的路径导致ans错误: Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34028    Accepted Submission(s): 8438 Problem Description "连连看"相信很多

迷宫问题 BFS入门水题

1102:迷宫问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:84 解决: 41 题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行是两个整数N和M(1<=N,M<=100). 接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格. 字符的含义如下: 'S':起点 'E':终点 '-':空地,可以通过 '#':障碍,无法通

hdu 1728 逃离迷宫 (bfs+循环队列)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15248    Accepted Submission(s): 3681 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

hdoj1242(bfs+priority_queue)

之前用dfs剪枝AC了,http://www.cnblogs.com/ediszhao/p/4741825.html,这次用bfs+priority_queue来尝试解题 题意:拯救行动,天使r有多个朋友a(friends,在这里被坑了几次,没看清题意),天使被关在牢房里,等着朋友来拯救,求拯救天使的最短距离. 以天使为起点进行bfs,找到的a就是最小拯救时间值. #include <iostream> #include <cstring> #include <queue&g

noip 01迷宫(BFS+记忆化)

题目链接:https://www.luogu.org/problem/show?pid=1141 题意:给出一个仅由数字0与1组成的n×n格迷宫.放0的那一格可以4个方向走到放1那一格,1也是四个方向走到放0的那一格.算上本身的那格.求最多能移动多少格子. 数据比较大,如果直接用bfs搜的话会暴时.所以需要每次搜索完都记录一下. 1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 using

学霸的迷宫(BFS+记录路径)

1 //求从(sx.sy)到(gx.gy)的最短距离; 2 3 #include<iostream> 4 #include<cstdio> 5 #include<cstdio> 6 #include<queue> 7 #include<cstring> 8 #define INF 99999999 9 10 using namespace std; 11 12 typedef pair<int, int > P; //数对,记录位置

迷宫问题(bfs的应用)

问题描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线.入口点为[0,0],既第一空格是可以走的路. Input 一个