正文

Rescue HDU1242 广搜2009-07-15 11:12:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/1mi2/45197.html

分享到:

超级无语,这样的题居然花了我这么久时间。头脑不清醒~~~ 本来一拿到题目是要用广搜的。头脑不知道一下子怎么短路了,明知道深搜会超时还是用了深搜! 后来想想还是广搜。#include<stdio.h> #include<limits.h> #define MAX 205 int a[MAX][MAX];//路形 int mark[MAX][MAX];//是否已搜标志 int f[1011][2];//搜索队列 int MIN[MAX][MAX]; int d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//4个方向 int main() {     char c;     int M,N,i,j;     int p,rear,dd;     int si,sj,di,dj;      while(scanf("%d%d",&M,&N)!=EOF)     {         for(i=0;i<M;i++)         {            scanf("%c",&c);            for(j=0;j<N;j++)            {                mark[i][j]=0;                MIN[i][j]=INT_MAX;                scanf("%c",&c);                if(c=='#')                    a[i][j]=-1;                else if(c=='.') a[i][j]=0;                else if(c=='x') a[i][j]=1;//警                else if(c=='a')                {                    di=i;                    dj=j;                }                else if(c=='r')                {                    si=i;                    sj=j;                }             }         }//for i         f[0][0]=si;         f[0][1]=sj;   MIN[si][sj]=0;         p=0;         rear=0;         while(p<=rear)         {             for(dd=0;dd<4;dd++)             {                 si=f[p][0]+d[dd][0];                 sj=f[p][1]+d[dd][1];                 if(si==di&&sj==dj)                 {      if(MIN[f[p][0]][f[p][1]]+1<MIN[di][dj])       MIN[di][dj]=MIN[f[p][0]][f[p][1]]+1;                 }                 if(si>=0&&si<M&&sj>=0&&sj<N&&a[si][sj]==1&&mark[si][sj]==0)                 {                     mark[si][sj]=1;                     rear++;                                f[rear][0]=si;                     f[rear][1]=sj;               MIN[f[rear][0]][f[rear][1]]=MIN[f[p][0]][f[p][1]]+2;                 }     else if(si>=0&&si<M&&sj>=0&&sj<N&&a[si][sj]==1&&MIN[f[p][0]][f[p][1]]+2<MIN[si][sj])//&&MIN[f[p][0]][f[p][1]]<INT_MIN-1)     {      MIN[si][sj]=MIN[f[p][0]][f[p][1]]+2;     }     if(si>=0&&si<M&&sj>=0&&sj<N&&a[si][sj]==0&&mark[si][sj]==0)                 {                     mark[si][sj]=1;                     rear++;                                f[rear][0]=si;                     f[rear][1]=sj;      MIN[f[rear][0]][f[rear][1]]=MIN[f[p][0]][f[p][1]]+1;                 }     else if(si>=0&&si<M&&sj>=0&&sj<N&&a[si][sj]==0&&MIN[f[p][0]][f[p][1]]+1<MIN[si][sj])//&&MIN[f[p][0]][f[p][1]]<INT_MIN-1)     {      MIN[si][sj]=MIN[f[p][0]][f[p][1]]+1;     }    }             p++;         }         if(MIN[di][dj]==INT_MAX)         {             printf("Poor ANGEL has to stay in the prison all his life.\n");         }   else printf("%d\n",MIN[di][dj]);     }     return 0; }

阅读(1747) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册