zoukankan      html  css  js  c++  java
  • ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II(优先队列广搜)

    #include<bits/stdc++.h>
    using namespace std;
    const int maxN = 123;
    const int inf = 1e9 + 7;
    char G[maxN][maxN];
    int times[maxN][maxN][6];
    int n, m, sx, sy, ex, ey, ans;
    int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
    
    struct node {
        int x, y, t, o;
        bool operator < (const node& p) const {
            return t > p.t;
        }
    };
    void bfs() {
        node t = (node) {
            sx, sy, 0, 0
        };
        times[sx][sy][0] = 0;
        priority_queue<node> q;
        q.push(t);
        while(!q.empty()) {
            node u = q.top();
            q.pop();
            int x = u.x, y = u.y, o = u.o, t = u.t;
    
            if(x == ex && y == ey) {
                ans = min(ans, t);
                return;
            }
            for(int d = 0; d < 4; d++) {
                int tx = x + dir[d][0];
                int ty = y + dir[d][1];
                if(tx < 0 || tx >= n || ty < 0 || ty >= m) //越界
                    continue;
    
    
                if(G[tx][ty] == '#') {
                    if(o == 0) {
                        continue;
                    } else if(times[tx][ty][o-1] > t + 2) {
    
                        q.push((node) {
                            tx,ty,t+2,o-1
                        });
    
                        times[tx][ty][o-1] = t + 2;
                    }
                } else if(G[tx][ty] == 'P' && times[tx][ty][o] > t) {
    
                    q.push((node) {
                        tx,ty,t,o
                    });
    
                    times[tx][ty][o] = t;
                } else if(G[tx][ty] == 'B' && o < 5 && times[tx][ty][o + 1] > t + 1) {
    
                    q.push((node) {
                        tx,ty,t+1,o+1
                    });
    
                    times[tx][ty][o + 1] = t + 1;
                } else if(times[tx][ty][o] > t + 1) {
    
                    q.push((node) {
                        tx,ty,t+1,o
                    });
    
                    times[tx][ty][o] = t + 1;
                }
            }
        }
    }
    int main() {
    
        while(~scanf("%d %d", &n, &m)) {
            if(n == 0)
                break;
            for(int i = 0; i < maxN; i++)
                for(int j = 0; j < maxN; j++)
                    for(int k = 0 ; k <= 5; k++)
                        times[i][j][k] = inf;
            for(int i = 0; i < n; i++) {
                scanf("%s", G[i]);
            }
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    if(G[i][j] == 'S')
                        sx = i, sy = j;
                    if(G[i][j] == 'T')
                        ex = i, ey = j;
                }
            }
    
            ans = inf;
            bfs();
            if(ans == inf) {
                printf("-1
    ");
            } else {
                printf("%d
    ", ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    JavaScript | 闭包
    Photoshop | 快速抠头发(调整边缘/选择并遮住)
    JavaScript | 基础表单验证(纯Js)
    JavaScript | 事件
    JavaScript | 数组
    JavaScript | 对象与属性
    JavaScript | 基础(变量/引用/转换/函数)
    Altium Designer 10 | 常用库及部分元件名中英文对照表
    电路 | 基本概念
    读点什么 |《把时间当作朋友》李笑来
  • 原文地址:https://www.cnblogs.com/Jadon97/p/9691594.html
Copyright © 2011-2022 走看看