• HDU 1728 逃离迷宫(bfs)


    逃离迷宫



     

    Problem Description
      给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
     

     

    Input
      第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
      第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
     

     

    Output
      每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
     

     

    Sample Input
    2
    5 5
    ...**
    *.**.
    .....
    .....
    *....
    1 1 1 1 3
    5 5
    ...**
    *.**.
    .....
    .....
    *....
    2 1 1 1 3
     
     

     

    Sample Output
    no
    yes
     
     1 #include<cstdio>
     2 #include<queue>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 struct point
     7 {
     8     int x,y;
     9     int cnt;
    10 };
    11 
    12 char map[105][105];
    13 int m,n,ex,ey,sx,sy,lim;
    14 int vis[105][105];
    15 int d[4][2]={0,1,1,0,-1,0,0,-1};
    16 
    17 bool bfs(int x,int y)
    18 {
    19     queue<point>q;
    20     point init;
    21     init.x=x,init.y=y;
    22     init.cnt=-1;
    23     vis[x][y]=1;
    24     q.push(init);
    25     while(!q.empty())
    26     {
    27         point t1,t2;
    28         t1=q.front();
    29         q.pop();
    30         if(t1.cnt>=lim)
    31         continue;
    32         for(int i=0;i<4;i++)
    33         {
    34             t2.x=t1.x+d[i][0];
    35             t2.y=t1.y+d[i][1];
    36             t2.cnt=t1.cnt+1;
    37             while(1)
    38             {
    39                 if(map[t2.x][t2.y]=='*'||t2.x<=0||t2.x>m||t2.y<=0||t2.y>n)
    40                 break;
    41                 if(t2.x==ex&&t2.y==ey)
    42                   return true;
    43                 if(!vis[t2.x][t2.y])
    44                 {
    45                     q.push(t2);
    46                     vis[t2.x][t2.y]=1;
    47                 }
    48                 t2.x+=d[i][0];
    49                 t2.y+=d[i][1];
    50             }
    51         }
    52     }
    53     return false;
    54 }
    55 
    56 int main()
    57 {
    58     //freopen("in.txt","r",stdin);
    59     int t;
    60     scanf("%d",&t);
    61     while(t--)
    62     {
    63         memset(vis,0,sizeof(vis));
    64         scanf("%d%d",&m,&n);
    65         for(int i=1;i<=m;i++)
    66         {
    67             getchar();
    68             for(int j=1;j<=n;j++)
    69             scanf("%c",&map[i][j]);
    70         }
    71         scanf("%d%d%d%d%d",&lim,&sy,&sx,&ey,&ex);
    72         if(bfs(sx,sy))
    73         printf("yes
    ");
    74         else
    75         printf("no
    ");
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    GitHub 的企业版
    我的Tag列表
    .net开发者对android开发一周的学习体会
    Ajax简单聊天B/S
    C#设计模式——享元模式(Flyweight Pattern)
    mongodb的sharding架构搭建
    Java设计模式
    LMAX架构
    Winform开发的常用类库
    C#设置本地网络(DNS、网关、子网掩码、IP)
  • 原文地址:https://www.cnblogs.com/homura/p/4708248.html
Copyright © 2020-2023  润新知