BFS PKU 3278

来源:互联网 发布:mac系统好还是windows 编辑:程序博客网 时间:2024/05/17 04:02
一道很简单的,典型的BFS。

代码虐我千百遍,我待代码如初恋微笑

Catch That Cow
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 47366 Accepted: 14869

Description

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

The 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.

Source

USACO 2007 Open Silver
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <ctype.h>#include <limits.h>#include <string.h>#include <string>#include <math.h>#include <algorithm>#include <iostream>#include <queue>#include <stack>#include <vector>#include <set>#include <map>#include <deque>using namespace std;#define MAXN 100000 + 10int vis[MAXN];int k;struct node{    int num;    int sum;    //int vis;}a[MAXN];void BFS(int n){    queue<node>q;    node front;    node rear;    front.num = n;    vis[n] = 1;    front.sum = 0;    q.push(front);    int mark1;    int mark2;    int mark3;    //int mark4;    //int sum = 0;    while(!q.empty()){        front = q.front();        q.pop();        if(front.num == k){            printf("%d\n",front.sum);            break;        }        mark1 = front.num - 1;        mark2 = front.num + 1;        mark3 = front.num*2;        if(mark1>=0 && vis[mark1]==0){            rear.num = mark1;            rear.sum = front.sum+1;            //sum++;            vis[mark1] = 1;            q.push(rear);        }        if(mark2<=100000 && vis[mark2]==0){            rear.num = mark2;            //sum++;            rear.sum = front.sum + 1;            vis[mark2] = 1;            q.push(rear);        }        if(mark3<=100000 && vis[mark3]==0){            rear.num = mark3;            //sum++;            rear.sum = front.sum + 1;            vis[mark3] = 1;            q.push(rear);        }    }}int main(){    int n;    while(~scanf("%d%d",&n,&k)){        memset(vis,0,sizeof(vis));        //memset(a,0,sizeof(a));        BFS(n);    }    return 0;}

 

0 0