题意,迷宫里救公主,打怪兽,等于多走一步,用个优先队列优先最小步数。
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;
}