题目链接: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>的更多相关文章

  1. P4554 小明的游戏 (洛谷) 双端队列BFS

    最近没有更新博客,全是因为英语,英语太难了QWQ 洛谷春令营的作业我也不会(我是弱鸡),随机跳了2个题,难度不高,还是讲讲吧,学学新算法也好(可以拿来水博客) 第一题就是这个小明的游戏 小明最近喜欢玩 ...

  2. 洛谷P1038 神经网络(bfs,模拟,拓扑)

    题目背景 人工神经网络(Artificial Neural NetworkArtificialNeuralNetwork)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸 ...

  3. 洛谷 P4201 设计路线 [NOI2008] 树形dp

    正解:树形dp 解题报告: 大概是第一道NOI的题目?有点激动嘻嘻 然后先放个传送门 先大概港下这题的题意是啥qwq 大概就是给一棵树,然后可以选若干条链把链上的所有边的边权变成0,但是这些链不能有交 ...

  4. 洛谷——P1958 上学路线_NOI导刊2009普及(6)

    P1958 上学路线_NOI导刊2009普及(6) 题目描述 你所在城市的街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道.南北方向的a条街道从西到东依次编号为l到a,而东西方向的b条街道从 ...

  5. 洛谷 P2296 寻找道路 —— bfs

    题目:https://www.luogu.org/problemnew/show/P2296 第一次用 Emacs 对拍,写了半天: 注意那个 is 赋值的地方很容易错,千万别反复赋值: 一道水题写了 ...

  6. 洛谷 P2437 蜜蜂路线

    P2437 蜜蜂路线 题目描述 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房M开始爬到蜂房N,M<N,有多少种爬行路线? 输入输出格式 ...

  7. 洛谷P2770 航空路线问题(费用流)

    传送门 完了这题好厉害……字符串什么的好麻烦…… 要求从$1$到$n$的路径,不重复,经过边数最多 每一个点拆成两个,$A_i,B_i$,然后$A_i$到$B_i$连容量为$1$,费用为$1$的边,保 ...

  8. 洛谷P2770 航空路线问题(费用流)

    题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...

  9. 洛谷 P2770 航空路线问题【最大费用最大流】

    记得cnt=1!!因为是无向图所以可以把回来的路看成另一条向东的路.字符串用map处理即可.拆点限制流量,除了1和n是(i,i+n,2)表示可以经过两次,其他点都拆成(i,i+n,1),费用设为1,原 ...

随机推荐

  1. 面向web前端及node开发人员的vim配置

    鉴于 window 下基本用不到 vim,所以下面内容不再提及 window,具体可以在相应 github 中查看手册操作基础:已装有上有 nodejs(npm).没装的可以移步官网:https:// ...

  2. JS对象之封装(二)

    JS 对象封装的常用方式 1.常规封装 function Person (name,age){ this.name = name; this.age = age; } Pserson.prototyp ...

  3. iview的render函数使用

    render渲染函数详解 https://www.cnblogs.com/weichen913/p/9676210.html iview表格的render函数作用是自定义渲染当前列,权限高于key,所 ...

  4. Linux apache让网页编码错误

    今天帮一个小伙伴搞作业,遇到安装discuz乱码问题,就顺便在这里写一下,以供其他同学纠正. 开apache配置文件/etc/httpd/conf/httpd.conf 查找AddDefaultCha ...

  5. CSS--transform相关属性实现2d到3d的具体变化

    先放上一段我写的相关代码(可能有一定冗杂代码,请见谅) <!DOCTYPE html> <html lang="en"> <head>      ...

  6. MATLAB神经网络(5) 基于BP_Adaboost的强分类器设计——公司财务预警建模

    5.1 案例背景 5.1.1 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类.其主要步骤为:首先给出弱学习算法和样本空间($X$,$Y$),从样本空间 ...

  7. .NET写入文件操作

    2018-01-16  22:44:35 许多程序需要记录运行日志,这就需要将程序运行记录写入本机,一般是.txt 文本或.csv 文件.具体操作如下: 一.C#   using System.IO; ...

  8. 大数据存储利器 - Hbase 基础图解

    由于疫情原因在家办公,导致很长一段时间没有更新内容,这次终于带来一篇干货,是一篇关于 Hbase架构原理 的分享. Hbase 作为实时存储框架在大数据业务下承担着举足轻重的地位,可以说目前绝大多数大 ...

  9. mui switch 点击事件不冒泡

    工作上遇到一个问题 手机移动端app,采用mui框架,要求左边是手机号码,右边是switch开关,并且点击标题的时候,可以展开下面人员的基本信息. 采用了折叠面板. 先上图如下: 开始时出现的问题是: ...

  10. CSS每日学习笔记(2)

    7.31.2019 1.CSS定位:允许你定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的位置. CSS 有三种基本的定位机制:普通流.浮动和绝对定位.除非专 ...