继续闲聊,这个题目是BFS的基础题目但是巩固,提取出来的知识也更精髓,我也将用两种方法展现:1.BFS;2.Floyd。今天有幸跟蔡大佬交流,希望自己有一天也能codefores(div2)AK。废话不多说,上题目:
P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1135
1.BFS
题目分析:
1.首先看到这个楼层+步数,可以定义一个结构体,(1.先在我们位于第几层楼里了)(2.我们操作这个按钮已经几次了)。
2.还是vis数组标记已经访问过得楼层,这其实有点不太好理解,为啥要标记呢?因为重复访问只会增加它的按钮次数,所以一定要标记访问过得数组。
3.因为这层楼的层数是有限制的,所以在楼层访问时一定要控制范围,(楼梯上下都可以去)。
上下你准备如何去操作呢?
4.利用队列,如果最后找到了该层楼就break,找不到的话就输出“-1”。
5.总体就是BFS经典思路,取队首,pop(),判断,标记,符合条件重新压入队列。
代码如下:
#include <iostream>
#include <vector>
#include<queue>
using namespace std;
struct node {
int f;//走到了第几层楼了
int step;//走了多少步啊
};
queue<node>s;
int vis[250];
int k[300];
int main()
{
int n, a, b;
cin >> n >> a >> b;
for (int i = 1; i <= n; i++) {
cin >> k[i];
}
s.push(node{ a,0 });
vis[a] = 1;
node top;
while (!s.empty()) {
top = s.front();
s.pop();
if (top.f == b) {
break;
}
for (int i = -1; i <= 1; i += 2) {//向上还是向下走
int dist = top.f + i * k[top.f];
if (dist > 0 && dist <= n && vis[dist]==0) {//判断条件
vis[dist] = 1;
s.push(node{ dist,top.step + 1 });//进行下一个楼层的下一次操作,按钮次数加一
}
}
}
if (top.f == b) {//如果有符合条件的
cout << top.step << endl;
}
else {
cout << "-1" << endl;/没有符合条件的
}
}
总体来说本博主想更新Floyd算法(多源最短路径,其实无非就是不停更新最小值),今晚博主去codefores比赛了,所以很累很累,先更新Codefores最新状况,明天更新Floyd。感谢观看!