从迷宫中逃脱

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. VS_VERSION_INFO

    VS_VERSION_INFO这里可以修改ocx的版本号

  2. Perl遍历查找文件

    Perl遍历查找文件 使用Perl查找当前目录下的所有PDF文件 ******************************************************************* ...

  3. JavaScript中BOOLEAN类型之三种情景代码举例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. JS生成一个种子随机数(伪随机数)

    原文链接:https://geniuspeng.github.io/2016/09/12/js-random/ 最近有一个需求,需要生成一个随机数,但是又不能完全随机,就是说需要一个种子seed,se ...

  5. Vim常用匹配、查找、替换命令总结

    以前都是从头开始找,最近处理log文件很多. 在vim 中输入 :1?XXXX 1的意思是文件的第一行 ?的意思是反向查找 XXXX就是你要找的关键字 更新:Linux 从末尾开始查找日志 tac c ...

  6. SAP 中的popup dialog (弹出对话框) 常见实现方法

      方法1: FM:POPUP_TO_CONFIRM(标准对话弹出消息) 有三个button:YES-NO-CANL,可进行对应的逻辑推断 可设定标题,描写叙述问题,不方便对文本进行换行等排版,不能改 ...

  7. 全栈JavaScript之路( 二十五 )訪问元素的样式

    不论什么支持style 特性的元素在 ,在其DOM  节点 对象中都有一个 style 属性与之相应. 这个style 对象是 CSSStyleDeclaration类型的实例,包括着html sty ...

  8. html5-4 HTML5超链接、URL地址和表格

    html5-4 HTML5超链接.URL地址和表格 一.总结 一句话总结: 1.cellspace有什么用? 清除表格的单元格间距 26 <table border='1px' cellspac ...

  9. PatentTips – CoAP Segment size determination

    BACKGROUND OF THE INVENTION The subject matter disclosed herein relates to routing data through a ne ...

  10. AE中网络分析的实现 的各个类之间的关系

    原文AE中网络分析的实现 的各个类之间的关系 1.     创建网络数据集 在ArcCatalog中勾选网络分析模块,新建个人地理信息数据库—>新建要素数据集—>批量导入要素—>创建 ...