优先队列+广度搜索
第一次优先队列,重载操作符不是我写的……………………
代码,参考大牛的……
………………
原来优先队列+BFS是这样滴
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
char s[201][201];
int n,m,vis[200][200],ans;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool es;
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 f,e;
void dfs()
{
priority_queue <node> q;
f.dis=0;
q.push(f);
vis[f.x][f.y]=1;
while(!q.empty())
{
node t=q.top();
q.pop();
for(int k=0;k<4;k++)
{
int i=t.x+dir[k][1];
int j=t.y+dir[k][0];
if(i<=n&&i>0&&j<=m&&j>0&&!vis[i][j]&&s[i][j]!='#')
{
vis[i][j]=1;
if(s[i][j]=='x')
q.push(node(i,j,t.dis+2));
if(s[i][j]=='.')
q.push(node(i,j,t.dis+1));
if(s[i][j]=='a')
{
es=1;ans=t.dis+1;
return ;
}
}
}
}
return ;
}
int main()
{
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>s[i][j];
if(s[i][j]=='r')//找出起点
{f.x=i;f.y=j;}
else if(s[i][j]=='a')
{e.x=i;e.y=j;}
}
es=0;
dfs();
if(es)
cout<<ans<<endl;
else cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
}
return 0;
}