链接

[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;
}

转载于:https://www.cnblogs.com/mch5201314/p/10645351.html

hdu-1728(贪心bfs的灵活运用吧)相关推荐

  1. HDU 1728 逃离迷宫(BFS的优化)

    这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...

  2. hdu 1728 逃离迷宫 (bfs)

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

  3. HDU 1728 逃离迷宫【BFS】

    题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...

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

    题目链接:点击查看 题目大意:给出起点和终点和最多的拐弯次数k,问拐弯次数能否在小于等于k的情况下从起点到达终点 题目分析:bfs,不过和以往的不太一样,以往的bfs都是每次加入一个点,而这个题目的限 ...

  5. hdu - 1072 Nightmare(bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1072 遇到Bomb-Reset-Equipment的时候除了时间恢复之外,必须把这个点做标记不能再走,不然可能造 ...

  6. HDU 1242 Rescue BFS+优先队列

    题目链接:点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1242 #include <stdio.h> #include <stri ...

  7. hdu 5720(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5720 官方题解: 考虑三角形三条边a,b,c  (a≥b) 的关系a−b<c,a+b>c  ...

  8. hdu 4982 贪心构造序列

    http://acm.hdu.edu.cn/showproblem.php?pid=4982 给定n和k,求一个包含k个不相同正整数的集合,要求元素之和为n,并且其中k-1的元素的和为完全平方数 枚举 ...

  9. HDU - 1043 Eight(bfs打表)

    题目链接:点击查看 题目大意:八数码经典问题,给出一个3*3的矩阵,其中随机分布着1~8的数字以及一个空位(我们用x来表示空位),在整个矩阵中,每一次操作都可以将x和他附近的方块互换,问经过多少次操作 ...

最新文章

  1. 经典机器学习算法系列3-k近邻算法
  2. 技术系列课回顾 | 视频 QoE 的平衡之道
  3. SAP UI5 requireBusyDialog
  4. linux重启was控制台报错,IHS启动时报错,从was控制台传播插件失败
  5. linux之xargs使用技巧
  6. 修改联通服务器密码,联通的服务器咋设置密码
  7. Python获取文件路径:os.listdir()和os.walk()
  8. Cozmo机器人使用中文Scratch3编程案例(codelab)
  9. 南航考研计算机学院学硕分数,2019南航计算机学硕经验贴
  10. android GPS开发
  11. 讲解三层代码讲解(DLL规则层如何接收服务器的数据,又如何交回给服务器)--第四课(*****) DATE :2004-06-01...
  12. JS将sql的dateTime格式数据例如:Wed Sep 30 00:00:00 CST 2020 字符串转换成2020-09-30 00:00:00时间格式
  13. 知人者智自知者明--所有的懊恼都是实力的差劲--我的第一次面试
  14. 君子签亮相2021中国互联网峰会,区块链电子签约赋能26家机构现场签约
  15. wordcloud制作词云图
  16. 利用开源工具搭一套汉英翻译系统(四):解码器Moses
  17. 建筑结构设计毕业论文参考范文
  18. 鸿蒙适配苹果手机,华为鸿蒙界面,让人眼前一亮!第一批适配机型出炉
  19. WPF界面控件Telerik UI for WPF初级入门教程 - 入门指南
  20. 大数据原理-关键技术

热门文章

  1. php 常用的知识点归集(下)
  2. Andrew Ng - 深度学习工程师 - Part 2. 改善深层神经网络:超参数调试、正则化以及优化(Week 1. 机器学习的实用层面)...
  3. sudo su 和 sudo -s区别
  4. ubuntu14.04不能安全卸载移动硬盘
  5. DELPHI跨平台的临界替代者
  6. 【转】android:DDMS查看Threads--不错
  7. Dede cms文章内容管理系统安全漏洞!如何有效防止DEDE织梦系统被挂木马安全设置...
  8. 解决DataGridView绑定List后不能排序的问题
  9. routing zuul_尚学堂0131之zuul的相关概念及如何性能调优
  10. timespan怎么比较大小_钻石吊坠回收怎么选择大小?