Problem D
/* 要注意使用优先队列,成功的路有长有短。 */ #include <iostream> #include <cstring> #include <queue> using namespace std; int n,m,sx,sy; char mp[222][222]; bool vis[222][222]; const int dp[4][2]={ {1,0},{-1,0},{0,1},{0,-1} }; struct Point { int x,y,step; bool operator <(const Point &p)const { return p.step<step; } }; void DataIn() { for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { cin>>mp[i][j]; if (mp[i][j]=='r') sx=i, sy=j; } } } void Bfs() { memset(vis,false,sizeof(vis)); Point now,next; priority_queue<Point> pq; now.x=sx; now.y=sy; now.step=0; pq.push(now); vis[now.x][now.y]=true; while (!pq.empty()) { now=pq.top(); pq.pop(); if (mp[now.x][now.y]=='a') { printf("%d\n", now.step); return ; } for (int i=0; i<4; i++) { next=now; next.x+=dp[i][0]; next.y+=dp[i][1]; if (next.x<0 || next.x>=n || next.y<0 || next.y>=m || vis[next.x][next.y] || mp[next.x][next.y]=='#') continue; if (mp[next.x][next.y]=='x') next.step=now.step+2; else next.step=now.step+1; vis[next.x][next.y]=true; pq.push(next); } } printf("Poor ANGEL has to stay in the prison all his life.\n"); return ; } int main() { while (~scanf("%d%d", &n,&m)) { DataIn(); Bfs(); } return 0; }