• 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;
    }
       
  • 相关阅读:
    lesson
    lesson
    课后习题-5
    lesson
    lesson
    lesson
    重启网络服务时 Bringing up interface eth0
    课后习题-4
    基础扩展
    课后习题-3
  • 原文地址:https://www.cnblogs.com/Hk456/p/12467236.html
Copyright © 2020-2023  润新知