搜索(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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!