poj 3278
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
简单bfs
#include<iostream> #include<queue> using namespace std; struct Node { int x,t;//当前的坐标 当前的时间 }; int v[1100111]; void bfs(int x,int y) { Node now,next; now.x=x;now.t=0; queue<Node>q; q.push(now); while(!q.empty()) { now=q.front();q.pop(); if(now.x==y) break; //共需3种要处理两种状态 next.x=now.x*2;//1 倍增 next.t=now.t+1;// if(next.x>=0&&next.x<=1100100&&next.t<v[next.x]) { v[next.x]=next.t; q.push(next); } next.x=now.x+1; next.t=now.t+1;//2 向右走 if(next.x>=0&&next.x<=1100100&&next.t<v[next.x]) { v[next.x]=next.t; q.push(next); } next.x=now.x-1; next.t=now.t+1;//3 向左走 if(next.x>=0&&next.x<=1100100&&next.t<v[next.x]) { v[next.x]=next.t; q.push(next); } } cout<<now.t<<endl; } int main() { int x,y; while(cin>>x>>y) { if(x>=y)//如果x>y 那么只能向后走 cout<<x-y<<endl; else { for(int i=1;i<=1100100;i++)//方便状态转移 v[i]=999999999; bfs(x,y); } } return 0; }