[洛谷1649]障碍路线<BFS>

题目链接:https://www.luogu.org/problem/show?pid=1649

历经千辛万苦,我总算是把这个水题AC了,现在心里总觉得一万只草泥马在奔腾;

这是一道很明显的BFS,然后我也明显的看出来了

但是,我就是WA了很久很久,在调试第一个晚上后,我发现读入是存在空格的,而不是数据问题

然后第二个问题就是,BFS找到的第一个终点不一定就是最优的答案(当然第二个问题是我重新打了一次猛然发现之前没注意的一点)

注意到这两点,其实这道题就没难度了

然后这道题的处理需要注意一个地方就是转弯,有两种方式来处理这个转弯

一:开结构体数组,记录当前点前驱的序号,然后看前驱的坐标和下一个位置的坐标是否有横纵坐标中的一个相等

二:开队列,然后用结构体,结构体里存一个direction(方向),然后定义上下左右分别对应1,2,3,4,如果当前点的方向和下一个拓展的方向相同,如果相同则拓展的方向没转弯

当然如果用数组的话会有一点的麻烦,用队列的话代码难度小一点而且更方便不会超时,我之前用数组也是超过时的,所以还是建议用队列

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #include<queue>
 8 #include<string>
 9 #define maxn 105
10 using namespace std;
11
12 const int dx[]={0,-1,1,0,0};
13 const int dy[]={0,0,0,-1,1};
14
15 struct node{
16     int x,y,s,d;//坐标,步数,方向
17 };
18
19 queue<node>q;
20 int n,map[maxn][maxn],vis[maxn][maxn];
21 int sx,sy,fx,fy,ans=10002;
22
23 void init()
24 {
25     scanf("%d",&n);
26     for(int i=1;i<=n;i++)
27      for(int j=1;j<=n;j++)
28      {
29          char a;
30          scanf("%c",&a);
31          while(a!=‘A‘&&a!=‘B‘&&a!=‘x‘&&a!=‘.‘)
32          {
33              scanf("%c",&a);
34          }
35          if(a==‘A‘){
36              sx=i;sy=j;
37          }
38          if(a==‘B‘){
39              fx=i;fy=j;
40          }
41          if(a==‘x‘){
42              map[i][j]=1;
43         }
44      }
45 }
46
47 int main()
48 {
49     init();
50     vis[sx][sy]=1;
51     q.push((node){sx,sy,0,0});
52     while(!q.empty())
53     {
54         node e=q.front();
55         q.pop();
56         vis[e.x][e.y]=1;
57         for(int i=1;i<=4;i++)
58         {
59             int zx=e.x+dx[i],zy=e.y+dy[i];
60             if(zx<1||zx>n||zy<1||zy>n)continue;
61             if(map[zx][zy]==0&&vis[zx][zy]==0){
62                 if(i==e.d||e.d==0){
63                     q.push((node){zx,zy,e.s,i});
64                 }else {
65                     q.push((node){zx,zy,e.s+1,i});
66                 }
67             }
68         }
69         if(e.x==fx&&e.y==fy){
70             ans=min(ans,e.s);
71         }
72     }
73     if(ans<=10000)printf("%d",ans);
74     else printf("-1");
75 }

时间: 2024-10-24 04:43:37

[洛谷1649]障碍路线<BFS>的相关文章

洛谷 P3956 棋盘 (BFS)

题目链接:https://www.luogu.org/problemnew/show/P3956 题目: 题目描述 有一个m × m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的), 你只能向上. 下.左. 右四个方向前进.当你从一个格子走向另一个格子时,如果两个格子的颜色相同,那你不需要花费金币:如果不同,则你需要花费 1 个金币. 另外, 你可以花费 2 个金币施展魔法让下一个无

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

记得cnt=1!!因为是无向图所以可以把回来的路看成另一条向东的路.字符串用map处理即可.拆点限制流量,除了1和n是(i,i+n,2)表示可以经过两次,其他点都拆成(i,i+n,1),费用设为1,原图中的边(i,j)连接(i+n,j,1),注意特判掉i==q&&j==nst直接相连的情况,流量要设为2,然后跑最大费用最大流,如果流量小于2就是无解,否则分别从s和tdfs输出方案. 记得输出方案前先输出一次起点. #include<iostream> #include<c

洛谷 P1649 [USACO07OCT]障碍路线Obstacle Course

P1649 [USACO07OCT]障碍路线Obstacle Course 题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these tiles are impassible by cows and are marked with an 'x' in this 5 by 5 field that is challenging to navigate: . . B x .

洛谷 1144 最短路计数 bfs

洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移,最后输出cnt即为结果.. 题目中所说的重边和自环啥的没看出来有啥影响.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxn = 100000 + 500;

【模板】矩阵快速幂 洛谷P2233 [HNOI2002]公交车路线

P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另外一个公交站往往要换几次车,例如从公交站A到公交站D,你就至少需要换3次车. Tiger的方向感极其糟糕,我们知道从公交站A到公交E只需要换4次车就可以到达,可是tiger却总共换了n次车,注意tiger一旦到达公交站E,他不会愚蠢到再去换车.现在希望你计算一下tiger有多少种可能的乘车方案. 题

洛谷P1027 Car的旅行路线

洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t. 图例(从上而下) 机场 高速铁路 飞机航线 注意:图中并没有 标出所有的铁路与航线. 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来

洛谷 P1379 八数码难题 Label:判重&amp;&amp;bfs

特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入输出格式 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数

洛谷 P1126 机器人搬重物 (BFS)

题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis数组和step大小,寻找最优解,一块加了上去,以为能AX,结果边界处理不对:50分 加了边界后才AC. (实际修改过程要坑爹的多orz 这么说吧,从20分到100分我全得过) 言归正传,搞一下这道题 广搜题,思路很好想:用结构体开个队列,分别保存每步的坐标.方向和步数,用vis数组保存当前格子上的最

洛谷OJ P1126 机器人搬重物 解题报告

洛谷OJ P1126 机器人搬重物 解题报告 by MedalPluS [题目描述]    机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方.机器人接受的指令有:向前移动1步(Creep):向前移动2步(Walk):向前移动3步(Run):向左转(Left):向右转(Right).