题目链接:点击查看

题目大意:给出起点和终点和最多的拐弯次数k,问拐弯次数能否在小于等于k的情况下从起点到达终点

题目分析:bfs,不过和以往的不太一样,以往的bfs都是每次加入一个点,而这个题目的限制条件是拐弯次数,那么我们可以每次加入一行或一列的点,因为这些点的拐弯次数都是相同的,需要注意一点的是,在while循环中不能判断vis情况,因为如果当前点早就被遍历过了,只能说明该点已经达到最优解了,但是在他之后的点并不一定被遍历过了,所以我们只需要跳过达到最优解的点,然后继续遍历后续可行点即可,举个例子理解一下吧:

下列数字代表拐弯次数的最优解,“x”代表还没被遍历过:

我们从加红的数字开始继续遍历:

2 x 1 x x

x x 1 x x

x x 1 x x

到此为止一切正常:

2 2 1 x x

x x 1 x x

x x 1 x x

接下来该遍历点1了,但是该绿色的1早就被遍历过,且最优解已经是1了,我们如果将判断vis的条件放到while上,就会导致后面的两个蓝色的x无法遍历,所以会WA

2 2 1 x x

x x 1 x x

x x 1 x x

我们最后想要得到的应该是这样的一个数组,那么就不能将vis条件放到while上判断,需要单独判断一下:

2 2 1 2 2

x x 1 x x

x x 1 x x

上代码吧:就是需要注意一下while的写法

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;int n,m;int k,x1,x2,y1,y2;char maze[N][N];bool vis[N][N];const int b[4][2]={0,1,0,-1,1,0,-1,0};struct Node
{int x,y,step;Node(int X,int Y,int STEP){x=X;y=Y;step=STEP;}Node(){}
};bool check(int x,int y)
{if(x<=0||x>n||y<=0||y>m)return false;if(maze[x][y]=='*')return false;return true;
}bool bfs()
{queue<Node>q;q.push(Node(x1,y1,-1));vis[x1][y1]=true;while(!q.empty()){Node cur=q.front();if(cur.x==x2&&cur.y==y2&&cur.step<=k)return true;q.pop();for(int i=0;i<4;i++){int xx=cur.x+b[i][0];int yy=cur.y+b[i][1];while(check(xx,yy)){if(!vis[xx][yy])//vis条件需要单独判断,不能写在check函数中{vis[xx][yy]=true;q.push(Node(xx,yy,cur.step+1));}xx+=b[i][0];yy+=b[i][1];}}}return false;
} int main()
{int w;cin>>w;while(w--){memset(vis,false,sizeof(vis));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%s",maze[i]+1);scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);if(bfs())cout<<"yes"<<endl;elsecout<<"no"<<endl;}return 0;
}

HDU - 1728 逃离迷宫(bfs)相关推荐

  1. hdu 1728 逃离迷宫 (bfs)

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

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

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

  3. HDU 1728 逃离迷宫【BFS】

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

  4. hdu 1728 逃离迷宫(dFS+优先队列)

    求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...

  5. HDU 1728 逃离迷宫

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...

  6. hdoj 1728 逃离迷宫

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

  7. HDU ACM 1728 逃离迷宫 (广搜BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点 输 ...

  8. hdu_1728_逃离迷宫(bfs)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:走迷宫,找最小的拐角 题解:对BFS有了新的理解,DFS+剪枝应该也能过,用BFS就要以拐 ...

  9. 逃离迷宫 ( BFS /DFS)

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

最新文章

  1. Context-Based Access Control (CBAC) 基于上下文的访问控制 理论知识
  2. 华为交换机SSH登录失败原因
  3. oracle会话状态,oracle中会话的状态
  4. 原来... C++ explicit的作用
  5. Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码
  6. mac mysql 设置短命令_短小强大的8个命令,分分钟帮你提高工作效率!
  7. linux扩容根目录空间_Linux系统扩容根目录磁盘空间的操作方法
  8. GOF之结构型模式Ⅰ(重点)
  9. html5文章标题定格,HTML5最佳做法; 部分/标题/旁边/文章元素
  10. 优盘完整性测试软件,MyDiskTest(U盘扩容检测工具)
  11. ae渲染出现错误是什么问题_AE 渲染输出 “H264”时出现这个错误是什么意思?...
  12. QT操作word表格——垂直居中、水平居中
  13. Python实现PD文字识别、提取并写入CSV文件脚本分享
  14. JS 控制LPT1 直接打印!
  15. java的弱引用_理解Java中的弱引用(Weak Reference)
  16. python 实现图片批量加入水印!
  17. Borderlands 3 for Mac 无主之地3
  18. MEMS智能传感器技术的新进展
  19. win10系统禁用笔记本自带键盘
  20. 天天优惠第一个版本于6月9日发布

热门文章

  1. 接口调试利器:Postman
  2. 通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法
  3. 对称加密-DES加密
  4. 常用的函数式接口_Consumer接口练习_字符串拼接输出
  5. flume案例-flume级联-组件分析
  6. 数据库-优化-索引-索引的优化注意事项
  7. 使用匿名内部类创建线程
  8. 访问数组元素进行获取
  9. spring配置详解-属性注入(set方式)
  10. 单一职责原理讲解coding