[洛谷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,原 ...
随机推荐
- lnmp 一键安装包(nginx) 运行laravel项目显示该网页无法正常运行
vi /usr/local/nginx/conf/fastcgi.conf 注释掉 PHP_ADMIN_VALUE #fastcgi_param PHP_ADMIN_VALUE "open_ ...
- node--fs
1.fs模块内置方法 1)stat 检测是文件还是目录 fs.stat(fileAddress,(err,stats)=>{ //err 出错信息 //stats.isFile() 该东西是文件 ...
- 关于CSS居中问题的一些总结
前端页面开发中关于内容居中的需求应用概率很大,自己搜集一些资料和总结关于css里的几种居中效果实现 第一常用text-align:center先将子元素将块级元素改为行内元素,即display:inl ...
- 【一统江湖的大前端(8)】matter.js 经典物理
目录 [一统江湖的大前端(8)]matter.js 经典物理 一.经典力学回顾 二. 仿真的实现原理 2.1 基本动力学模拟 2.2 碰撞模拟 三. 物理引擎matter.js 3.1 <愤怒的 ...
- webpack知识锦集(一)
ebpack是一个javascript应用吃那个程序的静态模块打包器(module bundler).处理时候会递归构建一个依赖关系图,包含每个模块,将模块打包成一个或者多个bundle. 核心概念: ...
- jenkins-构建job成功后自动打tag到git仓库
需求:最近开发同事提出了个要求,每当Jenkins执行上线部署完成后,对当前代码进行自动打TAG到git仓库中,且只有当部署成功后才进行打TAG,防止构建失败也进行打过多的垃圾tag,然后便于下次进行 ...
- 内网渗透之信息收集-Linux系统篇
linux 系统信息 grep MenTotal /proc/meminfo #查看系统内存总量 cat /etc/issue #查看系统名称 cat /etc/lsb-release #查看系统名称 ...
- Java集合01——List 的几个实现类,了解一下?
从本文起,我们将开始分享 Java 集合方面的知识,关注公众号「Java面典」了解更多 Java 知识点. List 是继承于 Collection 的接口,其实现类有 ArrayList,Linke ...
- 数据库中的两个最重要的日志redo log和binlog
mysql整体来看其实只有两部分,一部分是server层,一部分是引擎层. 1.redo log(重做日志):当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写入redo log里面,并更新 ...
- 你知道吗,Flutter内置了10多种show
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 showDialog showDialog 用于弹出Mat ...