优先队列+广度搜索
第一次优先队列,重载操作符不是我写的……………………
代码,参考大牛的……
………………
原来优先队列+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; }