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; }