链接

[https://vjudge.net/contest/256476#problem/D]

题意

 给定一个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, x 1, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1, y 1), (x 2, y 2)表示两个位置,其中x 1,x 2对应列,y 1, y 2对应行。

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

分析

首先题目输入故意坑人。注意点

因为有转弯限制,你这时候就得贪心了

就是dfs是就尽快能的往同一方向走这就尽可能地减少转弯

但是代码实现的时候有个bug.我后面也是看了别人的才知道自己的错

[https://www.cnblogs.com/qiufeihai/archive/2012/08/27/2659159.html]

讲的很清楚了。需要解释一下关键代码

	str ok;
ok.curk=tem.curk+1;
for(int i=0;i<4;i++){
ok.r=tem.r+d[i][0],ok.c=tem.c+d[i][1];
while(ok.r>=1&&ok.r<=n&&ok.c>=1&&ok.c<=m&&ma[ok.r][ok.c]=='.')
{
//即使其他方向的走过了这里,但是从另一个方向走的时候是可以经过这个位置的
if(!vis[ok.r][ok.c])
{//没检测过的点就检测
q.push(ok);
vis[ok.r][ok.c]=1;
}
//即使检测过了我也可以经过这个点往其他方向搜索
ok.r+=d[i][0];
ok.c+=d[i][1];
}
}

完整代码

#include<iostream>
#include<string.h>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=110;
char ma[N][N];
bool vis[N][N];
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
//上下左右
int x1,x2,y1,y2,k,n,m;
bool flag;
struct str{
int r,c,curk;
};
void bfs(){
str tem;
memset(vis,0,sizeof(vis));
tem.r=x1,tem.c=y1,tem.curk=-1;
vis[x1][y1]=1;
queue<str> q;
q.push(tem);
while(!q.empty()){
tem=q.front();
q.pop();
if(tem.r==x2&&tem.c==y2&&tem.curk<=k){
flag=1; break;
}
str ok;
ok.curk=tem.curk+1;
for(int i=0;i<4;i++){
ok.r=tem.r+d[i][0],ok.c=tem.c+d[i][1];
while(ok.r>=1&&ok.r<=n&&ok.c>=1&&ok.c<=m&&ma[ok.r][ok.c]=='.')
{
//即使其他方向的走过了这里,但是从另一个方向走的时候是可以经过这个位置的
if(!vis[ok.r][ok.c])
{//没检测过的点就检测
q.push(ok);
vis[ok.r][ok.c]=1;
}
//即使检测过了我也可以经过这个点往其他方向搜索
ok.r+=d[i][0];
ok.c+=d[i][1];
}
}
}
}
int main(){
int t;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--){
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>ma[i][j]; scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
flag=0;
bfs();
if(flag)
printf("yes\n");
else printf("no\n");
}
return 0;
}

hdu-1728(贪心&&bfs的灵活运用吧)的更多相关文章

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

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

  2. HDU - 1728 逃离迷宫 【BFS】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1728 思路 BFS 一开始 从开始位置 往四周走 如果能走的话 这个时候 转弯次数都是0 我们的标记不 ...

  3. HDU 1728 逃离迷宫

    [题目描述 - Problem Description] 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,glo ...

  4. hdu 1728

    //hdu 1728 //这个是一道很经典的迷宫题了,思路感觉...取起点和终点,判断连线是否超过n个弯, //先是从起点出发,上下左右四个方向搜索,找到一条路,把那条路的第一个点压入队列 //然后沿 ...

  5. HDU 1728:逃离迷宫(BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Problem Description   给定一个m × n (m行, n列)的迷宫,迷宫中有 ...

  6. hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...

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

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

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

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

  9. hdu 1728 逃离迷宫 BFS加优先队列 DFS()

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意就是能否在规定的转弯次数内从起点走到终点.刚走时那步方向不算. 只会bfs(),但想到这题需要记录转弯 ...

随机推荐

  1. Linux之数据库操作

    一.mysql基本操作 ,连接数据库 mysql -u root -p -h 127.0.0.1 mysql -u root -p -h 192.168.12.56 ,授予远程连接的权限 grant ...

  2. Flask入门之完整项目搭建

    一.创建虚拟环境 1,新建虚拟环境 cmd中输入:mkvirtualenv 环境名 2,在虚拟环境安装项目运行所需要的基本模块 pip install flask==0.12.4 pip instal ...

  3. Centos 7 Puppet之foreman介绍安装测试

    一.简介 1.前言(引用一下网上的资料) 随着企业的 Linux 系统数量越来越多,管理问题便成为一个相对麻烦并需要急 迫解决的问题,这里有 2 个 Key Message:1)统一管控体系非常重要, ...

  4. 【c#】队列(Queue)和MSMQ(消息队列)的基础使用

    首先我们知道队列是先进先出的机制,所以在处理并发是个不错的选择.然后就写两个队列的简单应用. Queue 命名空间 命名空间:System.Collections,不在这里做过多的理论解释,这个东西非 ...

  5. [PHP] try catch在日常中的使用

    1.try catch可以捕获上一层throw的异常 2.finally是不管try或者catch任何一块有return, 最终都会执行的块 3.try也是可以捕获到call_user_func_ar ...

  6. Java集合类:"随机访问" 的RandomAccess接口

    引出RandomAccess接口 如果我们用Java做开发的话,最常用的容器之一就是List集合了,而List集合中用的较多的就是ArrayList 和 LinkedList 两个类,这两者也常被用来 ...

  7. 关闭open页面时刷新父页面列表

    var winObjEI = window.open("/Invoice/InvoiceViewEI?invoiceid=" + data.InvoiceId); ; //关闭op ...

  8. AEAI CRM V1.6.0 升级说明,开源客户关系管理系统

    1 升级说明 AEAI CRM v1.6.0版是AEAI CRM v1.5.2版客户关系管理系统的升级版本,本次版本是基于AEAI DP v3.8.0_20170228进行打包部署的,升级内容主要是针 ...

  9. OpenCL中的half与float的转换

    在kernel中使用half类型可以在牺牲一定精度的代价下来提升运算速度. 在kernel中, 可以比较方便的对half数据进行计算, 但在host上的, 对half的使用就没那么方便了. 查看cl_ ...

  10. log4j详细配置

    参考博客:https://blog.csdn.net/sinat_30185177/article/details/73550377 log4j..很简单好用的一个记录日志的东东,正因为好用,本人从来 ...