博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1728 逃离迷宫
阅读量:5251 次
发布时间:2019-06-14

本文共 3093 字,大约阅读时间需要 10 分钟。

题目连接

 

逃离迷宫

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
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
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
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 LOCAL74 freopen("in.txt", "r", stdin);75 freopen("out.txt", "w+", stdout);76 #endif77 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

你可能感兴趣的文章
python中的pil模块_在Python中使用PIL模块处理图像的教程
查看>>
hashmap java 便利_Java中HashMap的四种遍历方法,及效率比较
查看>>
850是什么意思_楼板没有挠度和裂缝的计算结果原因是什么?
查看>>
华为v8支持云闪付吗_华为EMUI11将正式推送,37款机型计划升级,你的手机支持吗?...
查看>>
java快速开发框架_Java 后台开发框架
查看>>
go 切片 转字符串_Go语言爱好者周刊:第 58 期—关于 context
查看>>
android authorities 获取_挖穿Android第三十九天
查看>>
elementui展示多张图片_多张图片的PPT,如何排版的更有创意?
查看>>
中亿验钞机升级_新版人民币来了,可验钞机却无法识别?工作人员回应了
查看>>
airpods固件更新方法_如何更新 AirPods / AirPods Pro 的固件
查看>>
axure 图片切换图片的交互_用v-on:click v-bind v-show 实现图片切换
查看>>
js起一个数的平方根_LeetCode 题解 | 69. x 的平方根
查看>>
boot jndi数据源 spring_MyBatis 多数据源读写分离(注解实现)
查看>>
gin post 数据参数_Golang GinWeb框架快速入门/参数解析
查看>>
新增数据接口_Tablestore入门手册-UpdateRow接口详解
查看>>
账号管理工具_myMail — 手机端的最佳邮箱管理工具
查看>>
的g极串一个电阻_深入讲解三极管和MOS管加下拉电阻的作用,下次设计电路注意了...
查看>>
某一列高度变化_降料面过程中煤气成份的变化规律
查看>>
编码方式_常见的编码方式之ASCII编码解答
查看>>
组播vlan_接入网故障处理宝典:OLT双归属上联导致组播业务花屏故障案例
查看>>