[HDU]1728逃离迷宫

http://acm.hdu.edu.cn/showproblem.php?pid=1728

*代表墙, .代表路。问是否能从给定的一点走另一点。采取广度优先搜索。广度搜索从起点开始,依次搜索可以气扩展的每一个结点,当一层结点全部被搜索完后,再依次搜索第一个可扩展结点可以扩展的所有结点,直到找到或结点全被访问。

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
int hash[110][110],k;
int step[4][2]={{0,1},{1,0},{0,-1},{-1,0}};  
struct coord
{
    int x,y;
}qd,zd,c1,c2,que[110000];
int bfs()
{
    int head,tail,i;
    que[1]=qd;
    head=0;
    tail=1;
    if (zd.x==qd.x&&zd.y==qd.y) return 1;    //起点坐标和终点坐标一样 ,成功 
    if (hash[zd.x][zd.y]==-1) return 0;      //若终点坐标是*,即走不动,失败, 
    while(head<tail)                         //队列不为空 
    {
         c1=que[++head];                   
         if (hash[c1.x][c1.y]-1>=k) return 0;   //因为有限制转弯数,而第一次方向任意.        
                for(i=0;i<4;i++)               //分比尝试4种方向 
                {
                     c2=c1;
                     do
                     {
                          c2.x+=step[i][0];
                          c2.y+=step[i][1];
                          if (c2.x==zd.x && c2.y==zd.y) return 1;
                          if (!hash[c2.x][c2.y])        
                          {
                              que[++tail]=c2;
                              hash[c2.x][c2.y]=hash[c1.x][c1.y]+1;
                              
                          }
                     }while(hash[c2.x][c2.y]!=-1);
                }
    }
    return 0;
}
int main()
{
     int t,n,m,i,j;
     char s[110][110];
     scanf("%d",&t);
     while(t--)
     {
           scanf("%d%d",&n,&m);
           for(i=0;i<=n+1;i++)            //虽然只有n行,m列,但是需要在外围弄一层"墙" 
            for(j=0;j<=m+1;j++)
             hash[i][j]=-1;               //-1代表墙,0代表路 
           for(i=1;i<=n;i++)
           {
                 scanf("%s",s[i]);
                 for(j=1;j<=m;j++)
                 if(s[i][j-1]=='.') 
                 hash[i][j]=0;
                 else hash[i][j]=-1;
           }        
           scanf("%d%d%d%d%d",&k,&qd.y,&qd.x,&zd.y,&zd.x);   //是先输入列,再输入行 
           if(bfs())  printf("yes\n");
           else  printf("no\n");
     }
}

 

转载于:https://www.cnblogs.com/sjy123/p/3227944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值