hdu1242

链接:点击打开链接

题意:r为起点,a为终点,没走一步需要花费一个单位时间,x为怪,遇到怪可以考虑打怪,打怪会花费一个单位时间,问走到终点最少花费时间为多少

代码:

#include <queue>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int n,m,enx,eny;
int xx[]={-1,0,1,0};
int yy[]={0,-1,0,1};
char s[205][205];
struct node{
    int x,y,sum;
};
struct cmp{
    bool operator()(node a,node b){
        return a.sum>b.sum;
    }
};
int bfs(node st){
    priority_queue<node,vector<node>,cmp>q; //时间最少要用优先队列
    node cur,temp;
    int i,j;
    q.push(st);
    while(q.size()){
        cur=q.top();q.pop();
        if(cur.x==enx&&cur.y==eny)          //这里要用坐标,因为所有走过的路都变为了#    
        return cur.sum;
        for(i=0;i<4;i++){
            temp.x=cur.x+xx[i];
            temp.y=cur.y+yy[i];
            if(temp.x>=1&&temp.x<=n&&temp.y>=1&&temp.y<=m)
            if(s[temp.x][temp.y]!='#'){
                if(s[temp.x][temp.y]=='.')
                temp.sum=cur.sum+1;
                else if(s[temp.x][temp.y]=='x')
                temp.sum=cur.sum+2;
                q.push(temp);
                s[temp.x][temp.y]='#';      //走过的就变为#
            }
        }
    }
    return 0;
}                                            //bfs模板
int main(){
    int i,j,ans;
    node st;
    while(cin>>n>>m){
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            cin>>s[i][j];
            if(s[i][j]=='r')
            st.x=i,st.y=j,st.sum=0;
            if(s[i][j]=='a')
            enx=i,eny=j;
        }
        ans=bfs(st);
        if(ans!=0)
        printf("%d\n",ans);
        else
        printf("Poor ANGEL has to stay in the prison all his life.\n");
    }
    return 0;
}

你可能感兴趣的:(hdu1242)