1012 Rescue
题意:Angel was put in prison by Moligpy. Theprison is described as a N * M (N, M <= 200) matrix.他的朋友r想要救他,在矩阵中“.”代表路,“a”代表Angel,“x”代表卫兵,“#”代表墙,r每移动一个单位,花费一个时间,他杀死卫兵需要一个时间,求r到达Angel最短时间,他只能上下左右移动。
思路:广搜,最短路径,对于满足题意的加入到队列中,直到问题解出现。
感想:搜索中,判断边界以及墙,对于杀死卫兵,时间要加1,不能忽略。
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
int visit[201][201];
char map[201][201];
int n,m,sum,rx,ry,ax,ay;
struct node{
int x,y,time;
friend bool operator<(node a,node b){
return b.time<a.time;
}
};
int dri[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
bool check(int a,int b){
if(a<1||a>n||b<1||b>m||visit[a][b]||map[a][b]=='#') returntrue;
return false;
}
int bfs(){
node p,q;
p.x=rx; p.y=ry; p.time=0;
priority_queue<node> b;
b.push(p);
visit[rx][ry]=true;
while(!b.empty()){
p=b.top();
b.pop();
if(p.x==ax&&p.y==ay)
return p.time;
for(int i=0;i<4;i++){
q=p;
q.x+=dri[i][0];
q.y+=dri[i][1];
q.time++;
if(check(q.x,q.y)) continue;
if(map[q.x][q.y]=='x')
q.time++;
visit[q.x][q.y]=true;
b.push(q);
}
}
return 0;
}
int main(){
int i,j;
while(scanf("%d%d",&n,&m)!=EOF){
memset(visit,false,sizeof(visit));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
cin>>map[i][j];
if(map[i][j]=='r')
{
rx=i; ry=j;
}
if(map[i][j]=='a')
{
ax=i; ay=j;
}
}
sum=bfs();
if(sum)
cout<<sum<<endl;
else
cout<<"Poor ANGEL has to stay in the prison all hislife."<<endl;
}
return 0;
}