HDU - 1728 逃离迷宫(bfs)
题目链接:点击查看
题目大意:给出起点和终点和最多的拐弯次数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)相关推荐
- hdu 1728 逃离迷宫 (bfs)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 1728 逃离迷宫(BFS的优化)
这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...
- HDU 1728 逃离迷宫【BFS】
题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...
- hdu 1728 逃离迷宫(dFS+优先队列)
求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...
- HDU 1728 逃离迷宫
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...
- hdoj 1728 逃离迷宫
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU ACM 1728 逃离迷宫 (广搜BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点 输 ...
- hdu_1728_逃离迷宫(bfs)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:走迷宫,找最小的拐角 题解:对BFS有了新的理解,DFS+剪枝应该也能过,用BFS就要以拐 ...
- 逃离迷宫 ( BFS /DFS)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
最新文章
- Context-Based Access Control (CBAC) 基于上下文的访问控制 理论知识
- 华为交换机SSH登录失败原因
- oracle会话状态,oracle中会话的状态
- 原来... C++ explicit的作用
- Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码
- mac mysql 设置短命令_短小强大的8个命令,分分钟帮你提高工作效率!
- linux扩容根目录空间_Linux系统扩容根目录磁盘空间的操作方法
- GOF之结构型模式Ⅰ(重点)
- html5文章标题定格,HTML5最佳做法; 部分/标题/旁边/文章元素
- 优盘完整性测试软件,MyDiskTest(U盘扩容检测工具)
- ae渲染出现错误是什么问题_AE 渲染输出 “H264”时出现这个错误是什么意思?...
- QT操作word表格——垂直居中、水平居中
- Python实现PD文字识别、提取并写入CSV文件脚本分享
- JS 控制LPT1 直接打印!
- java的弱引用_理解Java中的弱引用(Weak Reference)
- python 实现图片批量加入水印!
- Borderlands 3 for Mac 无主之地3
- MEMS智能传感器技术的新进展
- win10系统禁用笔记本自带键盘
- 天天优惠第一个版本于6月9日发布