zoukankan      html  css  js  c++  java
  • HDU 1782.逃离迷宫

    逃离迷宫
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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, x 1, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1, y 1), (x 2, y 2)表示两个位置,其中x 1,x 2对应列,y 1, y 2对应行。 

    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
     
    BFS不记录距离,记录转的弯数
    套用BFS模板即可
     
     1 /*
     2 By:OhYee
     3 Github:OhYee
     4 Email:oyohyee@oyohyee.com
     5 Blog:http://www.cnblogs.com/ohyee/
     6 
     7 かしこいかわいい?
     8 エリーチカ!
     9 要写出来Хорошо的代码哦~
    10 */
    11 
    12 #include <cstdio>
    13 #include <algorithm>
    14 #include <cstring>
    15 #include <cmath>
    16 #include <string>
    17 #include <iostream>
    18 #include <vector>
    19 #include <list>
    20 #include <queue>
    21 #include <stack>
    22 #include <map>
    23 using namespace std;
    24 
    25 //DEBUG MODE
    26 #define debug 0
    27 
    28 //循环
    29 #define REP(n) for(int o=0;o<n;o++)
    30 
    31 const int maxn = 105;
    32 int n,m;
    33 char Map[maxn][maxn];
    34 int dis[maxn][maxn];
    35 
    36 typedef pair<int,int> point;
    37 
    38 const int delta[] = {1,-1,0,0};
    39 
    40 bool BFS(int s1,int s2,int v1,int v2,int k) {
    41     if(k < 0)
    42         return false;
    43     if(s1 == v1 && s2 == v2)
    44         return true;
    45 
    46     memset(dis,-1,sizeof(dis));
    47     queue<point> Q;
    48 
    49     Q.push(point(s1,s2));
    50     dis[s1][s2] = 0;
    51     while(!Q.empty()) {
    52         int x = Q.front().first;
    53         int y = Q.front().second;
    54         Q.pop();
    55 
    56         if(dis[x][y] == k+1)
    57             return false;
    58 
    59         REP(4) {
    60             int xx,yy;
    61             for(int i = 1;;i++) {
    62                 xx = x + delta[o] * i;
    63                 yy = y + delta[3 - o] * i;
    64 
    65                 if(xx < 0 || xx > n || yy < 0 || yy > m || Map[xx][yy] == '*')
    66                     break;
    67                 if(dis[xx][yy] == -1) {
    68                     dis[xx][yy] = dis[x][y] + 1;
    69                     if(xx == v1 && yy == v2)
    70                         return true;
    71                     Q.push(point(xx,yy));
    72                 }
    73 
    74 
    75             }
    76         }
    77     }
    78     return false;
    79 
    80 }
    81 
    82 void Do() {
    83     scanf("%d%d",&n,&m);
    84     for(int i = 0;i < n;i++)
    85         for(int j = 0;j < m;j++)
    86             scanf("
    %c
    ",&Map[i][j]);
    87     int s1,s2,v1,v2,k;
    88     scanf("%d%d%d%d%d",&k,&s2,&s1,&v2,&v1);
    89 
    90     printf("%s
    ",BFS(s1 - 1,s2 - 1,v1 - 1,v2 - 1,k) ? "yes" : "no");
    91 }
    92 
    93 int main() {
    94     int T;
    95     scanf("%d",&T);
    96     while(T--)
    97         Do();
    98     return 0;
    99 }
  • 相关阅读:
    JVM内存划分
    AIO
    软件精华收藏-[Windows] Photoshop 八零后的回忆版(只是40M)
    如何在 Ubuntu 中切换多个 PHP 版本
    wamp server 3.2.2.2 (64) 设置局域网访问
    WordPress站点遇到了致命错误解决方法,请查看您的站点的管理电子邮箱来获得指引
    WordPress主题开发:开启文章缩略图功能
    如何修改discuz首页logo
    Discuz怎么设置VIP用户组,dz用户vip组在哪添加
    discuz帖子中的图片和文字如何增加超链接呢?
  • 原文地址:https://www.cnblogs.com/ohyee/p/5416101.html
Copyright © 2011-2022 走看看