• [swustoj 1023] Escape


    Escape
     
     
    Description

    BH is in a maze,the maze is a matrix,he wants to escape!

    Input

    The input consists of multiple test cases.

    For each case,the first line contains 2 integers N,M( 1 <= N, M <= 100 ).

    Each of the following N lines contain M characters. Each character means a cell of the map.

    Here is the definition for chracter.

    For a character in the map: 

    'S':BH's start place,only one in the map.

    'E':the goal cell,only one in the map.

    '.':empty cell.

    '#':obstacle cell.

    'A':accelerated rune.

    BH can move to 4 directions(up,down,left,right) in each step.It cost 2 seconds without accelerated rune.When he get accelerated rune,moving one step only cost 1 second.The buff lasts 5 seconds,and the time doesn't stack when you get another accelerated rune.(that means in anytime BH gets an accelerated rune,the buff time become 5 seconds).

    Output

    The minimum time BH get to the goal cell,if he can't,print "Please help BH!".

    Sample Output

    5 5
    ....E
    .....
    .....
    ##...
    S#...
    5 8
    ........
    ........
    ..A....A
    A######.
    S......E

    Sample Output
    Please help BH!
    12

    BFS、注意一下优先级判断就行了

    #include <iostream>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define N 110
    
    struct Node
    {
        int x,y,t,r; //坐标,时间,剩余加速时间
        bool operator <(const Node &T)const{
            if(t!=T.t)return t>T.t;
            return r<T.r;
        }
    };
    
    int n,m;
    int sx,sy;
    int vis[N][N][8];
    char mpt[N][N];
    int dir[4][2]={-1,0,0,1,0,-1,1,0};
    
    void bfs()
    {
        Node now,next;
        priority_queue<Node> q;
        memset(vis,0,sizeof(vis));
        now.x=sx;
        now.y=sy;
        now.t=now.r=0;
        vis[sx][sy][0]=1;
        q.push(now);
        while(!q.empty())
        {
            now=q.top();
            q.pop();
            if(mpt[now.x][now.y]=='E'){
                printf("%d
    ",now.t);
                return;
            }
            for(int i=0;i<4;i++){
                next=now;
                next.x+=dir[i][0];
                next.y+=dir[i][1];
                next.t+=2;
                if(next.r>=1) {next.t--;next.r--;}
                if(next.x>=1 && next.x<=n && next.y>=1 && next.y<=m && mpt[next.x][next.y]!='#'){
                    if(mpt[next.x][next.y]=='A') next.r=5;
                    if(!vis[next.x][next.y][next.r]){
                        vis[next.x][next.y][next.r]=1;
                        q.push(next);
                    }
                }
            }
        }
        printf("Please help BH!
    ");
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    scanf(" %c",&mpt[i][j]);
                    if(mpt[i][j]=='S'){
                        sx=i;
                        sy=j;
                    }
                }
            }
            bfs();
        }
        return 0;
    }
  • 相关阅读:
    Linux内核参数信息(Oracle相关)
    Android和java平台 DES加密解密互通程序及其不能互通的原因
    [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
    理解 Thread.Sleep 函数
    引导加载程序:GRUB
    xvfb 初步探究
    [置顶] 中国象棋程序的设计与实现(原始版)(包含源码)
    Ext图表的精彩
    JSTL解析——004——core标签库03
    Servlet API中文版
  • 原文地址:https://www.cnblogs.com/hate13/p/4598272.html
Copyright © 2020-2023  润新知