hdu 1242 ( Rescue )

 
Problem : 1242 ( Rescue )     Judge Status : Accepted
思路:优先队列+BFS 
#include<iostream>
#include
<queue>
#include
<string>
using namespace std;
int n,m,ans;
string a[200];
int vis[200][200],ok;
int dir[4][2]={-1,0,0,1,1,0,0,-1};
struct node
{
int x,y,dis;
node(
int _x=0,int _y=0,int _dis=0):x(_x),y(_y),dis(_dis){};
friend
bool operator<(const node &a,const node & b)
{
return a.dis>b.dis;
}
};
node s,e;
void BFS()
{
ok
=0;
priority_queue
<node> q;
s.dis
=0;
q.push(s);
vis[s.x][s.y]
=1;
while(!q.empty())
{
node t
=q.top();
q.pop();
for(int k=0;k<4;k++)
{
int i=t.x+dir[k][0];
int j=t.y+dir[k][1];
if(i>=0&&i<n&&j>=0&&j<m&&!vis[i][j]&&a[i][j]!='#')
{
vis[i][j]
=1;
if(a[i][j]=='x')
{
q.push(node(i,j,t.dis
+2));
}
else if(a[i][j]=='.')
{
q.push(node(i,j,t.dis
+1));
}
else if(a[i][j]=='a')
{

ans
=t.dis+1;
ok
=1;
return;
}
}
}
}
}
int main()
{

while(cin>>n>>m)
{
memset(vis,
0,sizeof(vis));
for(int i=0;i<n;i++)
{
cin
>>a[i];
for(int j=0;j<m;j++)
{
if(a[i][j]=='a'){e.x=i;e.y=j;}
if(a[i][j]=='r'){s.x=i,s.y=j;}
}
}
BFS();
if(ok)cout<<ans<<endl;
else cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
}
}
posted on 2011-03-23 17:12  4.5.6  阅读(286)  评论(0编辑  收藏  举报