题目大意:
给你一个n*m的二维矩阵,包含墙壁,路,守卫,a,和r(可以不止一个),守卫所在的地方可以通过,但解决他需要花费1单位的时间,从一个点走向旁边的点也需要1单位的时间。求至少有一个r走到a的最短的时间。
题目分析:
因为r不只有一个,所以应该反过来从a搜索到r。由于通过守卫的时间需要两个单位,应用优先队列,让时间少的先行。
源代码:
#include<iostream> #include<queue> using namespace std; char map[201][201]; int dir[4][2]={0,1,0,-1,1,0,-1,0}; int n,m,ax,ay,flag; struct node { int x,y,step; friend bool operator < (node a,node b) { return a.step>b.step; } }w,p; int bfs(); int main() { while(cin>>n>>m) { flag=0; getchar(); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>map[i][j]; if(map[i][j]=='a') { ax=i; ay=j; } } getchar(); } int min; min=bfs(); if(flag==1) cout<<min<<endl; else cout<<"Poor ANGEL has to stay in the prison all his life."<<endl; } return 0; } int bfs() { priority_queue<node> q; w.x=ax;w.y=ay;w.step=0; while(!q.empty()) q.pop(); q.push(w); while(!q.empty()) { p=q.top(); q.pop(); if(map[p.x][p.y]=='r') { flag=1; return p.step; } for(int i=0;i<4;i++) { w.x=p.x+dir[i][0]; w.y=p.y+dir[i][1]; w.step=p.step+1; if(w.x>=0&&w.x<n&&w.y>=0&&w.y<m&&map[w.x][w.y]!='#') { if(map[w.x][w.y]=='x') w.step++; if(map[w.x][w.y]!='r') map[w.x][w.y]='#'; q.push(w); } } } }
当前水平评级:5