1012

题意:

a代表天使,r代表天使的朋友,然后x代表怪物,天使的朋友可以杀掉怪物,但要花费更多的时间要花时间2,而#代表墙,.代表可以走的路,要花费时间1。要你求出可以救出天使的最少时间,若不能则输出-1.

思路:

正如老师上课讲的,用优先队列,每走一步,所话的最小步数都保持在队列了头部,这样就可以保证所找到的步数一定是最小的。



     #include <cstdio>
     #include <cstdlib>
     #include <cstring>
     #include <cmath>
     #include <climits>


     const int MAX = 202;

     char map[MAX][MAX];
     int visit[MAX][MAX];
     int n,m,ax,ay,minx;

     void dfs(int x,int y,int len){
         if(x<0 || y<0 || x>=n || y>=m)return;
         if(len>=minx)return;
         if(map[x][y]=='#')return;
         if(visit[x][y]==1)return;
         if(map[x][y]=='r'){
             if(len<minx)minx=len;
             return;
         }
         if(map[x][y]=='x'){
             ++len;
         }
         visit[x][y]=1;
         dfs(x+1,y,len+1);
         dfs(x-1,y,len+1);
         dfs(x,y+1,len+1);
         dfs(x,y-1,len+1);
         visit[x][y]=0;
     }

     int main(){

         //freopen("in.txt","r",stdin);
         int i,j,len;
         while(scanf("%d %d%*c",&n,&m)!=EOF){
             for(i=0;i<n;++i){
                 for(j=0;j<m;++j){
                     map[i][j]=getchar();
                     if(map[i][j]=='a'){
                         ax = i;
                         ay = j;
                     }
                 }
                 getchar();
             }
             len = 0;
             minx = INT_MAX;
             dfs(ax,ay,len);
             if(minx!=INT_MAX){
                 printf("%d\n",minx);
             }else{
                 printf("Poor ANGEL has to stay in the prison all his life.\n");
             }

         }

         return 0;
     }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值