搜索(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 @ 2022-03-21 20:59  cloudcat233  阅读(33)  评论(0编辑  收藏  举报