当青训营遇上码上掘金
主题 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 ,小码在地点 ,并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。 步行:小青可以在一分钟内从任意节点 移动到节点 或 公交:小青可以在一分钟内从任意节点 移动到节点 (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久? 输入: 两个整数 和 输出: 小青到小码家所需的最短时间(以分钟为单位)
思路:BFS
显然这是一道可以直接搜索的题目,由于是最短路,并且路径的权值为 ,因此 直接就是首选啦~
当然由于本题是正权图,因此使用堆优化的 也是可以做的,但是由于要维护一个堆,因此可能实际情况下效率不如朴素 。
以小青所在的位置为状态,每次选择一种交通方式后变换的位置为另一状态,在搜索的过程中同时更新最小步数即可。
简单版本的C++实现如下~~~
#include<iostream>
#include<queue>
#include<vector>
const int inf = 0x3f3f3f3f;
int main() {
int n, k;
std::cin >> n >> k;
std::queue<int> q;
std::vector<int> dist(100005, inf);
q.push(n);
dist[n] = 0;
while (!q.empty()) {
int cur = q.front();
q.pop();
if (cur - 1 >= 0 && dist[cur - 1] > dist[cur] + 1) {
dist[cur - 1] = dist[cur] + 1;
q.push(cur - 1);
}
if (cur + 1 < 100005 && dist[cur + 1] > dist[cur] + 1) {
dist[cur + 1] = dist[cur] + 1;
q.push(cur + 1);
}
if (cur * 2 < 100005 && dist[cur * 2] > dist[cur] + 1) {
dist[cur * 2] = dist[cur] + 1;
q.push(cur * 2);
}
}
std::cout << dist[k] << std::endl;
}