逃离迷宫

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19656    Accepted Submission(s):
4783

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
 
我们举个例子: 要判断从S能否到T。
 
我们用used[][]来记录从S出发第一次到达某个位置时的转弯次数(也可以说成是起点S到该位置至少转弯次数),若为-1说明该点还未遍历。
 
初始化used 为 -1
 
 
上图:
 
 
我们假设遍历方向为左,上,右,下。为了简化问题,我们假设没有障碍物。
 
第一步:遍历完四个方向,对于若used[ x ][ y ]为负1的点,used[ x ][ y ] = 遍历起点次数  + 1 并且入队列(红线上的点除了遍历起点外全部入队 )。
 
 
二:继续上次同样的做法
 
 
重复上面的做法,因为蓝线上的点除了遍历起点之外used值全为-1,我们把它们全部入队且 used值 = 遍历起点的used + 1 = 1,证明从S点出发到这条线上任意一点都会至少转一次弯。
 
 
 
三:同上面
 
遍历完左边首先入队的点后,我们要遍历上方入队的点。图中给出已遍历位置的used值。我们开始遍历上方入队的点,如黄线,它也要遍历四个方向,但是对于已经计算过used值的点,就不能再更新也不能让它们入队,只将那些used值为-1的点更新used值后入队。
 
 
 
四:由S上方的第二个点开始遍历,我们看到会到达T点,这时计算T位置的used值 = 0 + 1 = 1。得到答案。
 
 
上面只是用图简单模拟下BFS过程中怎么记录转弯次数,当然这是最简单的情况。
 
 
 
思路:对队列里面的坐标(x,y)做选择时,每次选择一个方向(共四个方向)走到不能走为止,将沿途经过的所有used值 = -1的点入队并更新used值(对used不为-1的点不作处理)。队列为空还无法到终点,输出no。若能遍历到终点,判断used值是否大于要求的k,若大于输出no,否则输出yes。
 
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 110
using namespace std;
char map[MAX][MAX];
int vis[MAX][MAX];
int n,m;
int w,x1,x2,y1,y2;
void getmap()
{
int i,j;
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=m;j++)
{
scanf("%c",&map[i][j]);
}
}
}
struct node
{
int x,y;
};
int judge(int x,int y)
{
if(x>0&&x<=n&&y>0&&y<=m&&map[x][y]!='*')
return 1;
return 0;
}
void bfs()
{
int move[4][2]={0,1,0,-1,1,0,-1,0};
int i,j,ok=0;
queue<node>q;
node beg,end;
beg.x=x1;
beg.y=y1;
q.push(beg);
while(!q.empty())
{
end=q.front();
q.pop();
if(end.x==x2&&end.y==y2)
{
if(vis[end.x][end.y]<=w)
{
printf("yes\n");
ok=1;
}
else
break;
}
else
{
for(i=0;i<4;i++)
{
beg.x=end.x+move[i][0];
beg.y=end.y+move[i][1];
while(judge(beg.x,beg.y))
{
if(vis[beg.x][beg.y]==-1)
{
vis[beg.x][beg.y]=vis[end.x][end.y]+1;
q.push(beg);
}
beg.x+=move[i][0];//沿着这个方向继续走
beg.y+=move[i][1];
}
}
}
}
if(!ok)
printf("no\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
getmap();
scanf("%d%d%d%d%d",&w,&y1,&x1,&y2,&x2);
memset(vis,-1,sizeof(vis));
bfs();
}
return 0;
}

  

hdoj 1728 逃离迷宫的更多相关文章

  1. BFS HDOJ 1728 逃离迷宫

    题目传送门 /* BFS:三维BFS,加上方向.用dp[x][y][d]记录当前需要的最少转向数 */ #include <cstdio> #include <algorithm&g ...

  2. hdu 1728 逃离迷宫 bfs记转向

    题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  3. hdu 1728 逃离迷宫 bfs记步数

    题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  4. HDU 1728 逃离迷宫(DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)  ...

  5. HDU 1728 逃离迷宫(DFS经典题,比赛手残写废题)

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

  6. hdu 1728 逃离迷宫 [ dfs ]

    传送门 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. hdu 1728:逃离迷宫(DFS,剪枝)

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

  8. HDU 1728 逃离迷宫(DFS||BFS)

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

  9. hdu 1728 逃离迷宫 (BFS)

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

随机推荐

  1. ssh配置事务

    http://blog.csdn.net/jianxin1009/article/details/9202907(不错)

  2. index full scan/index fast full scan/index range scan

    **************************1************************************* 索引状态:          valid.      N/A .    ...

  3. MySQL数据库迁移详细步骤(转)

    ========================================================================================== 一.背景简介 == ...

  4. 使用OC开发phonegp 组件

    使用OC开发phonegp 组件 1. 使用oc 对phonegp中的组件近些开发,首先具体的pgonegp跟nativecode之间的一些优劣就不说了,开发phonegp 对应的组件主要就是使用na ...

  5. wpf 自定义RadioButton控件样式

    实现的效果为: 我感觉来自定义RadioButton样式和定义button空间的样式差不多,只是类型不同而已. 接下来分析一下样式代码: <!--自定义单选按钮样式-->        & ...

  6. 子树大小平衡树(Size Balanced Tree,SBT)操作模板及杂谈

    基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int ...

  7. Vim简明教程【CoolShell】

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...

  8. Bootstrap 和 LESS

    Bootstrap 简介 什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的 ...

  9. TortoiseSVN 的分支合并操作

    今天对svn的分支合并有了兴趣,所以对新建了一个项目练练手. 在网上找了一篇文章做指导: http://www.open-open.com/lib/view/open1346982569725.htm ...

  10. 非正式js语法

    有一种格式化的变种(该变种没有通过JSLint测试)略过了花括号,并将if语句放在同一行中. 这样做的好处是该循环语句变得可读性更强(对于每个拥有属性X的元素,就直接对X进行操作). 这样做的结果是只 ...