题目连接

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

逃离迷宫

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

bfs。。

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<vector>
 7 #include<queue>
 8 #include<map>
 9 using std::cin;
10 using std::cout;
11 using std::endl;
12 using std::find;
13 using std::sort;
14 using std::map;
15 using std::pair;
16 using std::queue;
17 using std::vector;
18 using std::multimap;
19 #define pb(e) push_back(e)
20 #define sz(c) (int)(c).size()
21 #define mp(a, b) make_pair(a, b)
22 #define all(c) (c).begin(), (c).end()
23 #define iter(c) decltype((c).begin())
24 #define cls(arr,val) memset(arr,val,sizeof(arr))
25 #define cpresent(c, e) (find(all(c), (e)) != (c).end())
26 #define rep(i, n) for (int i = 0; i < (int)(n); i++)
27 #define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
28 const int N = 110;
29 typedef unsigned long long ull;
30 char G[N][N];
31 bool vis[N][N][11][4]; // 访问标志
32 int H, W, K, Sx, Sy, Dx, Dy;
33 const int dx[] = { 0, 0, -1, 1 }, dy[] = { -1, 1, 0, 0 };
34 struct Node{
35     // x坐标,y坐标 方向 转弯次数
36     int x, y, dir, turn;
37     Node() {}
38     Node(int i, int j, int k, int l) :x(i), y(j), dir(k), turn(l) {}
39 };
40 bool bfs() {
41     cls(vis, false);
42     queue<Node> q;
43     rep(i, 4) {
44         int x = Sx + dx[i], y = Sy + dy[i];
45         if (x < 0 || x >= H || y < 0 || y >= W || G[x][y] == '*') continue;
46         q.push(Node(x, y, i, 0));
47         vis[x][y][0][i] = true;
48     }
49     while (!q.empty()) {
50         Node t = q.front(); q.pop();
51         if (t.x == Dx && t.y == Dy) return true;
52         rep(i, 4) {
53             int x = t.x + dx[i], y = t.y + dy[i];
54             if (x < 0 || x >= H || y < 0 || y >= W || G[x][y] == '*') continue;
55             if (t.dir == i) {
56                 bool &p = vis[x][y][t.turn][i];
57                 if (!p) {
58                     q.push(Node(x, y, t.dir, t.turn));
59                     p = true;
60                 }
61             } else {
62                 bool &p = vis[x][y][t.turn + 1][i];
63                 if (t.turn + 1 <= K && !p) {
64                     q.push(Node(x, y, i, t.turn + 1));
65                     p = true;
66                 }
67             }
68         }
69     }
70     return false;
71 }
72 int main() {
73 #ifdef LOCAL
74     freopen("in.txt", "r", stdin);
75     freopen("out.txt", "w+", stdout);
76 #endif
77     int t;
78     scanf("%d", &t);
79     while (t--) {
80         scanf("%d %d", &H, &W);
81         rep(i, H) scanf("%s", G[i]);
82         scanf("%d %d %d %d %d", &K, &Sy, &Sx, &Dy, &Dx);
83         Sx--, Sy--, Dx--, Dy--;
84         puts(bfs() ? "yes" : "no");
85     }
86     return 0;
87 }

View Code

转载于:https://www.cnblogs.com/GadyPu/p/4620606.html

hdu 1728 逃离迷宫相关推荐

  1. HDU 1728 逃离迷宫(BFS的优化)

    这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...

  2. hdu 1728 逃离迷宫 (bfs)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. hdu 1728 逃离迷宫(dFS+优先队列)

    求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...

  4. HDU 1728 逃离迷宫

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...

  5. HDU 1728 逃离迷宫【BFS】

    题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...

  6. HDU - 1728 逃离迷宫(bfs)

    题目链接:点击查看 题目大意:给出起点和终点和最多的拐弯次数k,问拐弯次数能否在小于等于k的情况下从起点到达终点 题目分析:bfs,不过和以往的不太一样,以往的bfs都是每次加入一个点,而这个题目的限 ...

  7. hdoj 1728 逃离迷宫

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. HDU ACM 1728 逃离迷宫 (广搜BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点 输 ...

  9. hdu 4524 郑厂长系列故事——逃离迷宫

    点击打开链接 郑厂长系列故事--逃离迷宫                                                                               T ...

  10. 逃离迷宫 ( BFS /DFS)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

最新文章

  1. 如何快速定位当前数据库消耗CPU最高的sql语句?
  2. 神策数据薛创宇:数据分析与场景实践之“坑位运营”
  3. CentOS系统恢复误删除的文件
  4. java 抽象类对象_Java基础___面向对象__抽象类
  5. python的reduce()函数
  6. 阶段3 3.SpringMVC·_07.SSM整合案例_04.ssm整合之编写SpringMVC框架
  7. 20.深入浅出:功率放大电路——参考《模拟电子技术基础》清华大学华成英主讲
  8. 单例模式的终结者——setAccessible(true)
  9. excel冻结窗口_excel表格怎么来冻结窗口同时冻结行和列
  10. 阿里收购优酷土豆:内容进入GGC时代!
  11. Oracle从dmp中导入一张表
  12. Vue3实现将页面转成PDF并下载或直接打印
  13. R语言将文件写入CSV,并读取
  14. USB之Cyusb3014芯片原理之三GPIF原理(十一) 2022-03-08
  15. 剑指offer_递归与循环---跳台阶
  16. sqlserver通过日志恢复删除数据(只能恢复小数据量)
  17. 天气预报文字版微信_早起微信励志语录 微信群里的带励志语录的天气预报在哪找...
  18. python包管理工具pip使用手册
  19. 脖子痛、腰痛、膝盖痛、背痛...教你一招立马不痛了!
  20. jenkin+docker 构建项目

热门文章

  1. 电脑插入U盘后里面的文件变成快捷方式解决办法
  2. 测试分类与名词解释你了解多少?(软件领域+游戏领域)
  3. Xp计算机同步时间,windows xp时间不准不能自动同步的解决办法
  4. 共享的计算机用户账户限制,连接共享文件夹,提示“登录失败:禁用当前的账户”...
  5. Replugin源码及原理深度剖析--唯一Hook点原理
  6. html如何设置超大字符集,[转载]【教程】CJk超大字符集使用方法
  7. 公司安全邮箱格式地址怎么写?安全邮件系统
  8. 考研政治——马克思主义唯物论之物质观
  9. 586A 586B线序
  10. Hou的图像显著性计算模型