BFS HDOJ 1728 逃离迷宫

题目传送门

  1 /*
  2     BFS:三维BFS,加上方向。用dp[x][y][d]记录当前需要的最少转向数
  3 */
  4 #include <cstdio>
  5 #include <algorithm>
  6 #include <cstring>
  7 #include <queue>
  8 #include <cmath>
  9 using namespace std;
 10
 11 const int MAXN = 1e2 + 10;
 12 const int INF = 0x3f3f3f3f;
 13 struct P
 14 {
 15     int x, y, z;
 16 }now, to;
 17 char maze[MAXN][MAXN];
 18 int dp[MAXN][MAXN][4];
 19 bool inq[MAXN][MAXN][4];
 20 int dx[4] = {-1, 1, 0, 0};
 21 int dy[4] = {0, 0, -1, 1};
 22 int k, x1, y1, x2, y2;
 23 int n, m;
 24
 25 bool check(int x, int y)
 26 {
 27     if (x >= 1 && x <= n && y >= 1 && y <= m)    return true;
 28     else    return false;
 29 }
 30
 31 bool BFS(void)
 32 {
 33     memset (dp, 0, sizeof (dp));
 34     memset (inq, false, sizeof (inq));
 35     queue<P> Q;
 36     for (int i=1; i<=n; ++i)
 37     {
 38         for (int j=1; j<=m; ++j)
 39         {
 40             for (int l=0; l<4; ++l)
 41             {
 42                 dp[i][j][l] = INF;    inq[i][j][l] = false;
 43             }
 44         }
 45     }
 46     for (int i=0; i<4; ++i)
 47     {
 48         dp[x1][y1][i] = 0;    inq[x1][y1][i] = true;
 49         Q.push ((P) {x1, y1, i});
 50     }
 51
 52     while (!Q.empty ())
 53     {
 54         now = Q.front ();    Q.pop ();
 55         for (int i=0; i<4; ++i)
 56         {
 57             to.x = now.x + dx[i];
 58             to.y = now.y + dy[i];    to.z = i;
 59             if (check (to.x, to.y) && maze[to.x][to.y] == ‘.‘)
 60             {
 61                 int tmp = dp[now.x][now.y][now.z];
 62                 if (to.z == now.z)
 63                 {
 64                     if (tmp < dp[to.x][to.y][to.z])
 65                     {
 66                         dp[to.x][to.y][to.z] = tmp;
 67                         if (!inq[to.x][to.y][to.z])
 68                         {
 69                             inq[to.x][to.y][to.z] = true;    Q.push (to);
 70                         }
 71                     }
 72                 }
 73                 else
 74                 {
 75                     if (++tmp < dp[to.x][to.y][to.z])
 76                     {
 77                         dp[to.x][to.y][to.z] = tmp;
 78                         if (!inq[to.x][to.y][to.z])
 79                         {
 80                             inq[to.x][to.y][to.z] = true;    Q.push (to);
 81                         }
 82                     }
 83                 }
 84             }
 85         }
 86         inq[now.x][now.y][now.z] = false;
 87     }
 88
 89     for (int i=0; i<4; ++i)
 90     {
 91         if (dp[x2][y2][i] <= k)    return true;
 92     }
 93
 94     return false;
 95 }
 96
 97 int main(void)        //HDOJ 1728 逃离迷宫
 98 {
 99 //    freopen ("HDOJ_1728.in", "r", stdin);
100
101     int t;    scanf ("%d", &t);
102     while (t--)
103     {
104         scanf ("%d%d", &n, &m);
105         for (int i=1; i<=n; ++i)    scanf ("%s", maze[i] + 1);
106         scanf ("%d%d%d%d%d", &k, &y1, &x1, &y2, &x2);
107         if (BFS ())    puts ("yes");
108         else    puts ("no");
109     }
110
111     return 0;
112 }
时间: 2024-10-10 20:27:32

BFS HDOJ 1728 逃离迷宫的相关文章

Hdoj 1728 逃离迷宫 【BFS】

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18546    Accepted Submission(s): 4472 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

hdoj 1728 逃离迷宫

逃离迷宫 点击打开链接 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19568    Accepted Submission(s): 4756 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

hdu 1728 逃离迷宫 bfs记转向

题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18702    Accepted Submission(s): 4526 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,g

HDU 1728 逃离迷宫(BFS)

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

hdu 1728 逃离迷宫 bfs记步数

题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18702    Accepted Submission(s): 4526 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,g

hdu 1728 逃离迷宫 (bfs+循环队列)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15248    Accepted Submission(s): 3681 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

HDU 1728 逃离迷宫

这道题做的我想哭啊..WA了将近十次了吧 一开始我用数组模拟的队列,后来和老大代码对拍,感觉改的是基本都一模一样了,还是WA 实在没有办法了,改用queue了 题目里的x是列y是行,和代码里的反过来的,要注意! 题目里面说在起点的时候无论朝哪个方向走都不算一次转弯,所以我们将方向和转弯次数都赋值为-1,这样就不用特殊处理了 入队条件,拓展后的转弯次数小于或等于vis数组中记录的最小转弯次数即可入队 输出结果,不要一搜到终点便急着输出,应为可能后面再一次搜到终点的时候转弯次数小于k 因此可以遍历完

HDU 1728 逃离迷宫 单方向BFS 或者DFS加剪枝

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18519    Accepted Submission(s): 4463 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地