hdu 1242 Rescue


点击打开链接


题意,迷宫里救公主,打怪兽,等于多走一步,用个优先队列优先最小步数。

bfs

坑爹的wa一次,交之前,就觉得要是救不到怎么输出,没看到题上说,,就输出个-1.结果gg

仔细读题发现,,,

#include<iostream>
#include<string>
#include<stdio.h>
#include<string.h>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=221;
const int maxm=20210;
const int inf = 0xffffff;
int n,m;
char ma[maxn][maxn];
int v[maxn][maxn];
int dir[4][2]={0,1,1,0,0,-1,-1,0};
struct node{
    int x,y,step;
    bool friend operator<(node a,node b){
        return a.step>b.step;
    }
}st,ed,u,e;
int judge(int x,int y){
    if(x<1||y<1||x>n||y>m) return 0;
    if(v[x][y]||ma[x][y]=='#') return 0;
    return 1;
}
int bfs(){
    st.step=0;
    v[st.x][st.y]=1;
    memset(v,0,sizeof(v));
    priority_queue<node>que;
    while(!que.empty()) que.pop();
    que.push(st);
    while(!que.empty()){
        u=que.top();//printf("%d %d %d\n",u.x,u.y,u.step);
        que.pop();
        if(u.x==ed.x&&u.y==ed.y) return u.step;
        for(int i=0;i<4;++i){
            e.x=u.x+dir[i][0];
            e.y=u.y+dir[i][1];
            if(judge(e.x,e.y)){
                if(ma[e.x][e.y]=='x') e.step=u.step+2;
                else e.step=u.step+1;
                v[e.x][e.y]=1;
                que.push(e);
            }
        }
    }
    return -1;
}
int main(){

    while(~scanf("%d %d",&n,&m)){
        for(int i=1;i<=n;++i){
            getchar();
            for(int j=1;j<=m;++j){
                scanf("%c",&ma[i][j]);
                if(ma[i][j]=='a') ed.x=i,ed.y=j;
                if(ma[i][j]=='r') st.x=i,st.y=j;
            }
        }
        int ans=bfs();
        if(ans==-1) printf("Poor ANGEL has to stay in the prison all his life.\n");
        else printf("%d\n",ans);
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值