ニャー雲荘喵の云的雪

搜索(bfs,dfs)

CloudCat·2022-03-21 20:59·46 次阅读

搜索(bfs,dfs)

DFS:时间换空间

BFS:空间换时间

题单:【算法1-7】搜索 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

BFS

例题:P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题解以及AC代码

复制代码
 1 /*注释例子 
 2     5 1 5
 3     3 3 1 2 5
 4 */
 5 #include<iostream>
 6 #include<queue>
 7 using namespace std;
 8 struct node
 9 {
10     int floor, d;//队列记录的层数与按钮次数
11 };
12 int n, a, b;
13 int k[1010], vis[1010];//每层上下可以跳跃几层,以及是否访问过
14 queue<node>Q;
15 int main()
16 {
17     cin >> n >> a >> b;
18     for (int i = 1; i <= n; i++)
19         cin >> k[i];
20     Q.push({ a,0 });//输入初始位置,初始次数为0
21     vis[a] = 1;//用于记录楼层是否被访问过(1代表访问过)
22     node now;//当前所在楼层
23     while (!Q.empty())//当队列为空时结束判断
24     {
25         now = Q.front();//队列先进先出//第一次时里面只有{a,0}(1,0)//
26         Q.pop();//移除队首元素//第一次时移除{a,0}(1,0)//
27         if (now.floor == b) break;//当目标楼层到达所求楼层,结束
28         for (int sign = -1; sign <= 1; sign += 2) {//sigh==1||sigh==-1//表示电梯上下两周情况
29             int dist = now.floor + k[now.floor] * sign;//经过一次改变目标楼层
30             if (dist >= 1 && dist <= n && vis[dist] == 0) {//如果按钮能到达楼层有效并且未访问过该楼层
31                 Q.push({ dist,now.d + 1 });//把访问的楼层加入队列
32                 vis[dist] = 1;//该楼层为已访问
33             }
34         }
35     }
36     if (now.floor == b) {
37         cout << now.d << endl;//输出
38     }
39     else
40         cout << -1 << endl;//如果没有找到,输出-1
41     return 0;
42 }
复制代码

 

posted @   cloudcat233  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示