#include<bits/stdc++.h> using namespace std; int n,m,vis[205][205],sx,sy,ex,ey; int dir[4][2]={1,0,0,1,-1,0,0,-1}; char g[205][205]; struct ss{ int x,y,step; //友缘关系运算符 重载< friend bool operator < (ss a,ss b){ return a.step>b.step; } }; int check(int x,int y){ if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]!='#') return 1; return 0; } void bfs(){ //优先_队列 priority_queue<ss> q; ss cur,tem; cur.x=sx;cur.y=sy;cur.step=0; q.push(cur);vis[cur.x][cur.y]=1; while(!q.empty()){ //优先队列用top不用front cur=q.top();q.pop(); if(cur.x==ex&&cur.y==ey) { cout<<cur.step<<endl;return ; } for(int i=0;i<4;i++){ tem.x=cur.x+dir[i][0]; tem.y=cur.y+dir[i][1]; if(check(tem.x,tem.y)&&!vis[tem.x][tem.y]){ if(g[tem.x][tem.y]=='x') tem.step=cur.step+2; else //包括'.'和'a' !!!a别漏了 tem.step=cur.step+1; vis[tem.x][tem.y]=1; q.push(tem); } } } cout<<"Poor ANGEL has to stay in the prison all his life."<<endl; } int main(){ while(cin>>n>>m){ for(int i=0;i<n;i++) for(int j=0;j<m;j++){ cin>>g[i][j]; vis[i][j]=0; if(g[i][j]=='a'){ ex=i;ey=j; } else if(g[i][j]=='r'){ sx=i;sy=j; } } bfs(); } }
优先队列=堆(是个二叉树)
一般默认大顶堆 ("根"比子树大)