从迷宫中逃脱

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 15120    Accepted Submission(s): 3650
Problem 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

题意:求是否能在给定转弯次数内到达终点。

题解:沿着一个方向走究竟。用一个数组记录转弯次数。第45行加了个剪枝。由于用的是广搜,所以第一次到达时肯定是用转弯次数最少的时候,若此时转弯次数都超了那就不用继续搜索下去了。

时间从62ms降低到15ms。

#include <stdio.h>
#include <string.h>
#include <queue>
#define maxn 102
using std::queue; char map[maxn][maxn];
int steps, m, n, step[maxn][maxn];
int mov[][2] = {1, 0, -1, 0, 0, 1, 0, -1};
struct Node{
int x, y;
Node operator+(int i){
Node t;
t.x = x + mov[i][0];
t.y = y + mov[i][1];
return t;
}
}; bool check(int x, int y)
{
return x < m && x >= 0 && y < n && y >= 0
&& map[x][y] != '*';
} bool BFS(int x, int y)
{
if(map[x][y] == 'T') return true;
memset(step, -1, sizeof(step));
Node now, t;
int i;
now.x = x; now.y = y;
queue<Node> Q;
Q.push(now);
while(!Q.empty()){
now = Q.front(); Q.pop();
for(i = 0; i < 4; ++i){
t = now + i;
while(check(t.x, t.y)){
//保证不反复入队。可能出现路线交叉的情况
if(step[t.x][t.y] == -1){
step[t.x][t.y] = step[now.x][now.y] + 1;
if(map[t.x][t.y] == 'T'){
if(step[t.x][t.y] <= steps) return 1;
return 0;
}
Q.push(t);
}
t = t + i;
}
}
}
return false;
} int main()
{
int t, x1, y1, x2, y2, i;
scanf("%d", &t);
while(t--){
scanf("%d%d", &m, &n);
for(i = 0; i < m; ++i)
scanf("%s", map[i]);
scanf("%d%d%d%d%d", &steps, &y1, &x1, &y2, &x2);
--x1; --y1; --x2; --y2;
map[x2][y2] = 'T';
if(BFS(x1, y1)) puts("yes");
else puts("no");
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU1728 从迷宫中逃脱 【方向BFS】的更多相关文章

  1. hdu1728逃离迷宫 (利用最短路径思想+优先队列(BFS))

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

  2. hdu1728 逃离迷宫---转弯次数不超过k+BFS

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目大意: 给你一幅图,给出起点终点和最大转弯次数,判断是否能从起点到终点.'*'表示障碍物. ...

  3. 逃离迷宫(HDU 1728 BFS)

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

  4. hdu1728 逃离迷宫

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

  5. Hdu1728 逃离迷宫 2017-01-17 10:56 81人阅读 评论(0) 收藏

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

  6. DFS(5)——hdu1728逃离迷宫

    一.题目回顾 题目链接:逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地 ...

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

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

  8. 别忽视UIImage中的方向属性, imageOrientation-转

    转 : 别忽视UIImage中的方向属性, imageOrientation

  9. hdu1728 逃离迷宫bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1728/ 关于广度优先搜索的第一篇题解.广度优先搜索,就是状态树的层次遍历,一层一层的搜索,直到搜索到目标状态为止 ...

随机推荐

  1. spyder在虚拟机上运行内核一直崩溃

    可能的原因是因为虚拟机设置的内存过小了

  2. Unity中做放大镜 效果

    孙广东  2015.8.16 事实上和 小地图都几乎相同了. 还是要借助 还有一个相机 目的: 这篇文章的主要目的是  要给你一个想法  怎样做放大境效果 . 在unity中能够简单的实现放大镜效果啊 ...

  3. (十三)RabbitMQ消息队列-VirtualHost与权限管理

    原文:(十三)RabbitMQ消息队列-VirtualHost与权限管理 VirtualHost 像mysql有数据库的概念并且可以指定用户对库和表等操作的权限.那RabbitMQ呢?RabbitMQ ...

  4. Python 线程启动的四种方式

    import threading,_thread def action(i): print(i **32) #带有状态的子类 class Mythread(threading.Thread): def ...

  5. [D3] Create Labels from Numeric Data with Quantize Scales in D3 v4

    Sometimes data needs to be converted from a continuous range, like test scores, to a discrete set of ...

  6. Qt 学习: 视图选择 (QItemSelectionModel)

    博主QQ:1356438802 选择是视图中经常使用的一个操作.在列表.树或者表格中,通过鼠标点击能够选中某一项,被选中项会变成高亮或者反色.在 Qt 中,选择也是使用了一种模型.在 model/vi ...

  7. android jni与java之间数据传输时怎么转换

    1.c中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为c的char*. Java 类型 本地c类型 说明 boolean jboolean 无符号 8 位 b ...

  8. Qt 静态函数QMetaObject::connectSlotsByName(QObject * object)

    看别人代码看到void on_MyWidget_slotTest(); 就郁闷了,没看到他代码里有connect 却能把信号和槽可以连接起来. 今日回顾书本发现该函所的nb之处. QMetaObjec ...

  9. html5-1 网页结构描述

    html5-1 网页结构描述 一.总结 一句话总结:注意head中的title,keywords,description,这对seo优化很有帮助 1.如何给某元素动态使用类似onclick方法? 点o ...

  10. php课程 6-22 字符串格式化函数有哪些(精问)

    php课程 6-22 字符串格式化函数有哪些(精问) 一.总结 一句话总结: 1.猜测一下$_GET()怎么来的? 函数赋值给变量的操作:$_YZM=get();   这样就可以很好的解释哪些全局变量 ...