Catch That Cow POJ - 3278 [bfs][最短路]

来源:互联网 发布:哈夫曼编码c语言实现 编辑:程序博客网 时间:2024/06/07 06:57

Catch That Cow

 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.    * Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute   * Teleporting: FJ can move from any point X to the point 2 × X in a single minute.  If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

Input

  Line 1: Two space-separated integers: N and K

Output

Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.

Sample Input

  5 17

Sample Output

  4

Hint

  fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
#include <iostream>#include <string>#include <queue>using namespace std;int v[200000]={0};queue<int> line;bool judge(int a){ //判断是否可以拓展    if (v[a] == 0 && a >= 0 && a <= 100000 ) return true;    else return false;}int main() {    int n,m;    while ( cin >> n >> m) {        int min=100000;        if(n == m) {            cout << '0' << endl;            continue;        }        memset(v, 0, sizeof(v));        while ( !line.empty()) {            line.pop();        }        v[n] = 1;        line.push(n);        int time=0;        int k; //拓展层数        while ( !line.empty()) {            k = line.front();//            cout << "k:" <<  k;            line.pop();            if( judge(k+1) ) {line.push(k+1); v[k+1] += v[k]+1;}            if( judge(k-1) ) {line.push(k-1);  v[k-1] += v[k]+1;}            if (judge(k*2))  {line.push(k*2);  v[k*2] += v[k]+1;}        }        cout << v[m]-1 <<endl;    }}
0 0