Problem D

/*
    要注意使用优先队列,成功的路有长有短。 
*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int n,m,sx,sy;
char mp[222][222];
bool vis[222][222];
const int dp[4][2]={ {1,0},{-1,0},{0,1},{0,-1} };
struct Point {
    int x,y,step;
    bool operator <(const Point &p)const {
        return p.step<step;
    }
};
void DataIn() {
    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            cin>>mp[i][j];
            if (mp[i][j]=='r') sx=i, sy=j;
        }
    }
}
void Bfs() {
    memset(vis,false,sizeof(vis));
    Point now,next;
    priority_queue<Point> pq;
    now.x=sx;
    now.y=sy;
    now.step=0;
    pq.push(now);
    vis[now.x][now.y]=true;
    while (!pq.empty()) {
        now=pq.top();
        pq.pop();
        if (mp[now.x][now.y]=='a') {
            printf("%d
", now.step);
            return ;
        }
        for (int i=0; i<4; i++) {
            next=now;
            next.x+=dp[i][0];
            next.y+=dp[i][1];
            if (next.x<0 || next.x>=n || next.y<0 || next.y>=m || vis[next.x][next.y] || mp[next.x][next.y]=='#') continue;
            if (mp[next.x][next.y]=='x') next.step=now.step+2;
            else next.step=now.step+1;
            vis[next.x][next.y]=true;
            pq.push(next);
        }
    }
    printf("Poor ANGEL has to stay in the prison all his life.
");
    return ;
}
int main() {
    while (~scanf("%d%d", &n,&m)) {
        DataIn();
        Bfs();
    }
    return 0;
}
   
原文地址:https://www.cnblogs.com/Hk456/p/12467236.html