[洛谷1649]障碍路线<BFS>
题目链接:https://www.luogu.org/problem/show?pid=1649
历经千辛万苦,我总算是把这个水题AC了,现在心里总觉得一万只草泥马在奔腾;
这是一道很明显的BFS,然后我也明显的看出来了
但是,我就是WA了很久很久,在调试第一个晚上后,我发现读入是存在空格的,而不是数据问题
然后第二个问题就是,BFS找到的第一个终点不一定就是最优的答案(当然第二个问题是我重新打了一次猛然发现之前没注意的一点)
注意到这两点,其实这道题就没难度了
然后这道题的处理需要注意一个地方就是转弯,有两种方式来处理这个转弯
一:开结构体数组,记录当前点前驱的序号,然后看前驱的坐标和下一个位置的坐标是否有横纵坐标中的一个相等
二:开队列,然后用结构体,结构体里存一个direction(方向),然后定义上下左右分别对应1,2,3,4,如果当前点的方向和下一个拓展的方向相同,如果相同则拓展的方向没转弯
当然如果用数组的话会有一点的麻烦,用队列的话代码难度小一点而且更方便不会超时,我之前用数组也是超过时的,所以还是建议用队列
PS:接下来这个代码在洛谷上是可以过的,因为数据较水
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<string>
#define maxn 105
using namespace std; const int dx[]={,-,,,};
const int dy[]={,,,-,}; struct node{
int x,y,s,d;//坐标,步数,方向
}; queue<node>q;
int n,map[maxn][maxn],vis[maxn][maxn];
int sx,sy,fx,fy,ans=; void init()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
char a;
scanf("%c",&a);
while(a!='A'&&a!='B'&&a!='x'&&a!='.')
{
scanf("%c",&a);
}
if(a=='A'){
sx=i;sy=j;
}
if(a=='B'){
fx=i;fy=j;
}
if(a=='x'){
map[i][j]=;
}
}
} int main()
{
init();
vis[sx][sy]=;
q.push((node){sx,sy,,});
while(!q.empty())
{
node e=q.front();
q.pop();
vis[e.x][e.y]=;
for(int i=;i<=;i++)
{
int zx=e.x+dx[i],zy=e.y+dy[i];
if(zx<||zx>n||zy<||zy>n)continue;
if(map[zx][zy]==&&vis[zx][zy]==){
if(i==e.d||e.d==){
q.push((node){zx,zy,e.s,i});
}else {
q.push((node){zx,zy,e.s+,i});
}
}
}
if(e.x==fx&&e.y==fy){
ans=min(ans,e.s);
}
}
if(ans<=)printf("%d",ans);
else printf("-1");
}
但是仔细斟酌,如果是100*100的图,而没有障碍,那么普通的队列是会爆的,这个可以自己尝试
所有改成优先队列做
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<string>
#define maxn 105
using namespace std; const int dx[]={,-,,,};
const int dy[]={,,,-,}; struct node{
int x,y,s,d;//坐标,步数,方向
bool operator< (const node &a)const{
return s>a.s;}
}; priority_queue<node>q;
int n,map[maxn][maxn],vis[maxn][maxn];
int sx,sy,fx,fy,ans=; void init()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
char a;
scanf(" %c",&a);
while(a!='A'&&a!='B'&&a!='x'&&a!='.')
{
scanf("%c",&a);
}
if(a=='A'){
sx=i;sy=j;
}
if(a=='B'){
fx=i;fy=j;
}
if(a=='x'){
map[i][j]=;
}
}
} int main()
{
init();
vis[sx][sy]=;
q.push((node){sx,sy,,});
while(!q.empty())
{
node e=q.top();
q.pop();
vis[e.x][e.y]=;
for(int i=;i<=;i++)
{
int zx=e.x+dx[i],zy=e.y+dy[i];
if(zx<||zx>n||zy<||zy>n)continue;
if(map[zx][zy]==&&vis[zx][zy]==){
if(i==e.d||e.d==){
q.push((node){zx,zy,e.s,i});
}else {
q.push((node){zx,zy,e.s+,i});
}
}
}
if(e.x==fx&&e.y==fy){
//if(e.s>=ans)
ans=min(ans,e.s);break; }
}
if(ans<=)printf("%d",ans);
else printf("-1");
}
真·AC
这个代码的区别就是优先队列,和跳出语句,其中跳出的时候要注意特例,可能会存在到终点不用转弯的线上的点的转弯次数相同但是来源到终点却有转弯和不转弯的情况,,所以要特判一个当现在的值会大于等于ans就跳出
特例
。。。。A
。。。。。
。B 。。。
到B左边的点时,转弯一次,到b右边的点时,转弯一次,但是左边点会多转一次,所以要特判一下
[洛谷1649]障碍路线<BFS>的更多相关文章
- P4554 小明的游戏 (洛谷) 双端队列BFS
最近没有更新博客,全是因为英语,英语太难了QWQ 洛谷春令营的作业我也不会(我是弱鸡),随机跳了2个题,难度不高,还是讲讲吧,学学新算法也好(可以拿来水博客) 第一题就是这个小明的游戏 小明最近喜欢玩 ...
- 洛谷P1038 神经网络(bfs,模拟,拓扑)
题目背景 人工神经网络(Artificial Neural NetworkArtificialNeuralNetwork)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸 ...
- 洛谷 P4201 设计路线 [NOI2008] 树形dp
正解:树形dp 解题报告: 大概是第一道NOI的题目?有点激动嘻嘻 然后先放个传送门 先大概港下这题的题意是啥qwq 大概就是给一棵树,然后可以选若干条链把链上的所有边的边权变成0,但是这些链不能有交 ...
- 洛谷——P1958 上学路线_NOI导刊2009普及(6)
P1958 上学路线_NOI导刊2009普及(6) 题目描述 你所在城市的街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道.南北方向的a条街道从西到东依次编号为l到a,而东西方向的b条街道从 ...
- 洛谷 P2296 寻找道路 —— bfs
题目:https://www.luogu.org/problemnew/show/P2296 第一次用 Emacs 对拍,写了半天: 注意那个 is 赋值的地方很容易错,千万别反复赋值: 一道水题写了 ...
- 洛谷 P2437 蜜蜂路线
P2437 蜜蜂路线 题目描述 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房M开始爬到蜂房N,M<N,有多少种爬行路线? 输入输出格式 ...
- 洛谷P2770 航空路线问题(费用流)
传送门 完了这题好厉害……字符串什么的好麻烦…… 要求从$1$到$n$的路径,不重复,经过边数最多 每一个点拆成两个,$A_i,B_i$,然后$A_i$到$B_i$连容量为$1$,费用为$1$的边,保 ...
- 洛谷P2770 航空路线问题(费用流)
题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...
- 洛谷 P2770 航空路线问题【最大费用最大流】
记得cnt=1!!因为是无向图所以可以把回来的路看成另一条向东的路.字符串用map处理即可.拆点限制流量,除了1和n是(i,i+n,2)表示可以经过两次,其他点都拆成(i,i+n,1),费用设为1,原 ...
随机推荐
- 进阶之路 | 奇妙的Thread之旅
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 需要已经具备的知识: Thread的基本概念及使用 AsyncTask的基本概念及使用 学习清单: 线程概述 ...
- 《Javascript中 == 和 === 的区别》
在js中 ==(相等运算符) 和 === (严格运算符)是两种判断两个变量是否相等的运算符. == :判断是否相等,忽略类型进行值的比较.(存在隐式类型转换的比较) ===:判断是否相等,先判断值是否 ...
- 2018-05-04 圣杯布局 and 双飞翼布局,display:flex
看到一个神奇的布局,啥都不说了 直接贴代码 要让main在中间,left在左边,可以通过Flex容器下的项目的属性“order”属性来设置:对于order属性:定义项目的排列顺序,越小越靠前,默认为0 ...
- 安装mysql.so
1.---- cd /usr/local/src/php-5.5.34/ext/mysql/2.---- /usr/local/php5/bin/phpize3.---- ./configure ...
- Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式
一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...
- C#桌面开发的未来-WebWindow
WebWindow源码作者博客基于Chromium的Edge体验体验方式一:体验方式二:预期目标:遗留的问题 WebWindow WebWindow是跨平台的库. Web Window的当前实验实现可 ...
- Druid 0.17 入门(3)—— 数据接入指南
在快速开始中,我们演示了接入本地示例数据方式,但Druid其实支持非常丰富的数据接入方式.比如批处理数据的接入和实时流数据的接入.本文我们将介绍这几种数据接入方式. 文件数据接入:从文件中加载批处理数 ...
- Silence主题 美观清爽的cnblog第三方主题
为什么推荐? 才开通cnblog,但苦于官方主题都不是很好看,翻找Github的时候发现了这个项目Silence 这是预览地址 官方展示图片 安装中的坑 不显示公共模块.博文目录.博文签名.博文赞赏. ...
- 《ASP.NET Core 3框架揭秘》5折预售暨样章发布
<ASP.NET Core 3框架揭秘>于昨天在下午京东正式开始预售,并在半天之内销售近一千套.为了回馈读者,出版社与京东谈了一个5折的价格.与此同时,我将本书最核心的内容作为样章(3章) ...
- JDBC 查询 模板
JDBC 查询 与增删改不同的是SQL语句的不同,还有查询反回的是结果集 需要定义 利用 next()方法逐层查询数据 使用getXXX方法获取数据 代码相关参数根据个人设置进行修改!!!! pac ...