从迷宫中逃脱

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. stm32的dac

  2. linux的任务计划 定时任务 计划任务

    例如要定时访问一个指定的url 先看看系统有没有crontab

  3. 《SPA设计与架构》之认识SPA

    原文 简书原文:https://www.jianshu.com/p/84323f530223 大纲 前言 1.什么是单页面应用程序(SPA) 2.SPA与传统Web应用的区别 3.关于SPA的使用 4 ...

  4. Vue.js如何划分组件

    常见的一些页面,大家坐在一起敲代码就可以了,做完这个页面再做别的页面,但是作为一个功能复杂的系统,尤其是使用一些适合模块化开发的框架,这样会显得效率很低,那么我们就单纯的看在Vue里面如何划分组件的. ...

  5. Gradle自己定义插件

    Gradle自己定义插件 在Gradle中创建自己定义插件,Gradle提供了三种方式: 在build.gradle脚本中直接使用 在buildSrc中使用 在独立Module中使用 开发Gradle ...

  6. 诊断并解决CentOS SSH连接慢的方法

    诊断并解决CentOS SSH连接慢的方法: http://os.51cto.com/art/201507/484743.htm

  7. NetSnmp配置

    http://blog.csdn.net/shanzhizi/article/details/16985989

  8. 【t084】数列

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B ...

  9. Android BlueDroid(一):BlueDroid概述

    关键词:bluedroid bluez作者:xubin341719(欢迎转载,请注明作者,请尊重版权,谢谢!)欢迎指正错误.共同学习.共同进步!! 一.名词解释:(实用信息添加中--) BTI F: ...

  10. Python将被加入高考科目?你怎么看?

    今天看到这样的一则新闻:不禁感叹,人工智能这股风来的太快,已经掀起全民学习Python的浪潮. 2017年中观察:看上去这个大纲内容基本是这样了,但是实行年份可能要往后推了,不在2017年执行了(据说 ...