1012 Rescue

来源:互联网 发布:iphone抢购软件 编辑:程序博客网 时间:2024/06/05 01:09

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;

}

0 0
原创粉丝点击