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

    【题目描述 - Problem Description】

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

    【输入 - Input】

    【输出 - Output】

      第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对应行。

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

    【输入样例 - Sample Input】

    【输出样例 - Sample Output】

    2
    5 5
    ...**
    *.**.
    .....
    .....
    *....
    1 1 1 1 3
    5 5
    ...**
    *.**.
    .....
    .....
    *....
    2 1 1 1 3

    no
    yes

    【题解】

      因为自己这方面只会DFS和SPFA,据说这道题是BFS,而且BFS和SPFA同源?所以就来试试

      把起点标记为-1,周围4个方向能刷新则无脑刷新成0,保存被刷新的点进队列,以此类推……

      当前点的数值达到K的时候就可以停止刷新了,因为前面刷新的值都<=k,后面没必要继续了。

    【代码 C++】

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 char map[105][105];
     5 int k;
     6 struct point{
     7     int x, y;
     8 }temp;
     9 std::queue<point> que;
    10 void mark(int nowX, int nowY, int fX, int fY){
    11     int len = map[nowY][nowX] + 1;
    12     while (map[nowY + fY][nowX + fX] != '*' && len <= map[nowY + fY][nowX + fX]){
    13         nowY += fY, nowX += fX, map[nowY][nowX] = len;
    14         temp.y = nowY, temp.x = nowX, que.push(temp);
    15     }
    16 }
    17 int main(){
    18     int t, stX, stY, edX, edY, lX, lY, i;
    19     scanf("%d", &t);
    20     memset(map, '*', sizeof(map));
    21     while (t--){
    22         scanf("%d%d", &lY, &lX), getchar();
    23         ++lX;
    24         for (i = 1; i <= lY; ++i) gets(&map[i][1]), map[i][lX] = '*';
    25         memset(map[i], '*', sizeof(map[i]));
    26         scanf("%d%d%d%d%d", &k, &stX, &stY, &edX, &edY);
    27         while (!que.empty()) que.pop();
    28         if (map[stY][stX] != '*'){
    29             map[stY][stX] = -1;
    30             temp.x = stX, temp.y = stY, que.push(temp);
    31         }
    32         while (!que.empty()){
    33             temp = que.front(), stX = temp.x, stY = temp.y;
    34             if (map[stY][stX] >= k) break;
    35             mark(stX, stY, 0, 1);
    36             mark(stX, stY, 0, -1);
    37             mark(stX, stY, 1, 0);
    38             mark(stX, stY, -1, 0);
    39             que.pop();
    40         }
    41         if (map[edY][edX] <= k) puts("yes");
    42         else puts("no");
    43     }
    44     return 0;
    45 }

     HDU 1728

  • 相关阅读:
    正则表达式
    http协议组成(请求状态码)
    谈一谈你对js线程的理解
    CSS 中定位方式有几种,说明他们的意义
    手机端白屏前端优化的方法,5 种以上
    用 js 写一个获取随机颜色的程序
    如何获取本地存储信息
    cuda 版本查阅
    ubuntu16.04 ROS安转及RVIZ启动
    Tensorflow和Caffe 简介
  • 原文地址:https://www.cnblogs.com/Simon-X/p/5216063.html
Copyright © 2011-2022 走看看