bfs求最短路

poj 3278牛
http://poj.org/problem?id=3278
Ramen经过长时间的研究,终于研发出了能够跃迁的宇宙飞船。现在,他想要前往致远星。假设地球和致远星都在一个坐标轴上,其中地球位于坐标n,而致远星位于坐标k。而Ramen的飞船支持以下两种运动方式:

飞行:在一个时间单位中,能够从坐标x移动到x-1或x+1;
跃迁:在一个时间单位中,能够直接从x跃迁到2x。
现在,Ramen想知道,他需要多长时间才能到达致远星?

输入描述
两个值,分别代表n和k。(0 ≤ n, k ≤ 100,000)

输出描述
输出Ramen最少需要的时间。

样例输入
5 17

样例输出
4

样例解释
Ramen的行走轨迹为:5-10-9-18-17

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 2e5 + 10;
int a[N] = { 0 };
bool vis[N] = { false };
int n, k;
bool sign = false;
queue<int>p;
void bfs() {
    a[n] = 0;
    p.push(n);
    while (!p.empty()) {
        int n = p.front();
        p.pop();
        if (n == k)break;
        vis[n] = true;
        if (!vis[n + 1] && n < N - 1) {
            a[n + 1] = a[n] + 1;
            p.push(n + 1);
            vis[n + 1] = true;
        }
        if (!vis[n - 1] && n > 0) {
            a[n - 1] = a[n] + 1;
            p.push(n - 1);
            vis[n - 1] = true;
        }
        if (2 * n < N && !vis[2 * n]) {
            a[2 * n] = a[n] + 1;
            p.push(2 * n);
            vis[2 * n] = true;
        }

    }
}
int main()
{
    cin >> n >> k;
    bfs();
    cout << a[k] << endl;
}
全部评论

相关推荐

Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
10-25 02:13
门头沟学院 C++
_凡_:8.27笔试10.22评估
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务