题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242
题面:
从a出发去找r,用优先队列,当前cost值小的,优先级高,只要找到一个r就可以结束了。
代码:
#include
#include
#include
#include
#include
#include
#define eps 1e-8
#define LL long long
using namespace std;
int n,m,ans,dir[4][2]={0,-1,-1,0,0,1,1,0};
char mapp[202][202];
bool vis[202][202];
struct step
{
int x,y,cost;
bool operator <(const step &b)const
{
return cost>b.cost;
}
};
priority_queue qe;
void bfs(int x,int y)
{
while(!qe.empty())
qe.pop();
int tx,ty;
step tmp,cur;
tmp.x=x;
tmp.y=y;
tmp.cost=0;
qe.push(tmp);
while(!qe.empty())
{
cur=qe.top();
qe.pop();
for(int i=0;i<4;i++)
{
tx=cur.x+dir[i][0];
ty=cur.y+dir[i][1];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty])
{
if(mapp[tx][ty]=='r')
{
vis[tx][ty]=1;
ans=cur.cost+1;
return;
}
else if(mapp[tx][ty]=='x')
{
tmp.x=tx;
tmp.y=ty;
tmp.cost=cur.cost+2;
qe.push(tmp);
}
else
{
vis[tx][ty]=1;
tmp.x=tx;
tmp.y=ty;
tmp.cost=cur.cost+1;
qe.push(tmp);
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int xa,ya,cnt=0;
memset(vis,0,sizeof(vis));
ans=50000;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf(" %c",&mapp[i][j]);
if(mapp[i][j]=='a')
{
xa=i;
ya=j;
vis[i][j]=1;
}
else if(mapp[i][j]=='r')
{
cnt++;
}
else if(mapp[i][j]=='#')
vis[i][j]=1;
}
}
if(cnt==0)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
{
bfs(xa,ya);
if(ans==50000)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n",ans);
}
}
return 0;
}