题目大意:
天使的朋友拯救天使
.代表路
#代表墙
a代表天使
r代表天使的朋友
x代表卫兵
四个方向一步1秒,打败一个卫兵要1秒,输出救出天使的最短时间
代码如下:
#include<iostream>
#include<string>
#include<queue>
using namespace std;
int dir[][2]={0,1,1,0,0,-1,-1,0},m,n,vis[201][201];
char map[201][201];
struct Node
{
int x,y,v;
friend bool operator < (const Node &a,const Node &b) //优先队列"<"重载,步数少的先搜
{
return a.v>b.v;
}
};
int Bound(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!='#')
return 1;
return 0;
}
int Bfs(int x,int y)
{
Node cur;
priority_queue<Node> q;
cur.x=x;
cur.y=y;
cur.v=0;
q.push(cur);
memset(vis,0,sizeof(vis));
vis[x][y]=1;
while(!q.empty())
{
for(int i=0;i<4;i++)
{
cur.x=q.top().x+dir[i][0];
cur.y=q.top().y+dir[i][1];
if(Bound(cur.x,cur.y)==1&&!vis[cur.x][cur.y])
{
if(map[cur.x][cur.y]=='x')
cur.v=q.top().v+2;
else
cur.v=q.top().v+1;
if(map[cur.x][cur.y]=='r')
return q.top().v+1;
q.push(cur);
vis[cur.x][cur.y]=1;
}
}
q.pop();
}
return 0;
}
int main()
{
int i,j,x,y;
while(cin>>n>>m)
{
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='a')
{
x=i;
y=j;
}
}
x=Bfs(x,y);
if(x==0)
cout<<"Poor ANGEL has to stay in the prison all his life.\n";
else
cout<<x<<endl;
}
return 0;
}