# Catch That Cow

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11677    Accepted Submission(s): 3617

Problem 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

Recommend
teddy   |   We have carefully selected several similar problems for you:  2102 1372 1240 1072 1180

DFS入门题目，但数据量较大。注意开数组的大小，容易RE。

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int N,K;
const int MAXN = 100000;
int visited[MAXN+10];  //判重标记,visited[i] = true表示i已经扩展过
struct Step
{
int x;  //位置
int steps;  //到达x所需的步数
Step(int xx,int s):x(xx),steps(s) { }
};
queue<Step> q;  //队列,即Open表
int main()
{
cin >> N >> K;
memset(visited,0,sizeof(visited));
q.push(Step(N,0));
visited[N] = 1;
while(!q.empty())
{
Step s = q.front();
if( s.x == K )   //找到目标
{
cout << s.steps <<endl;
return 0;
}
else
{
if( s.x - 1 >= 0 && !visited[s.x-1] )
{
q.push(Step(s.x-1,s.steps+1));
visited[s.x-1] = 1;
}
if( s.x + 1 <= MAXN && !visited[s.x+1] )
{
q.push(Step(s.x+1,s.steps+1));
visited[s.x+1] = 1;
}
if( s.x * 2 <= MAXN &&!visited[s.x*2]  )
{
q.push(Step(s.x*2,s.steps+1));
visited[s.x*2]  = 1;
}
q.pop();
}
}
return 0;
}


#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

int main()
{
int s,e;
while(cin>>s>>e){
queue<int> a;
bool y[100006];
memset(y,0,sizeof(y));
if(s>=e)
{
cout<<s-e<<endl;
continue;
}
int ans=1;
a.push(s);
y[s]=1;
a.push(-999999);
while(1)
{
int x=a.front();
if(x==-999999){
a.push(-999999);
ans++;
a.pop();
continue;
}
if(x-1>=0&&!y[x-1]){
if(x-1==e){cout<<ans<<endl;break;}
else{a.push(x-1);y[x-1]=1;}
}
if(x+1<=100000&&!y[x+1]){
if(x+1==e){cout<<ans<<endl;break;}
else{a.push(1+x);y[1+x]=1;}
}
if(x*2<=100000&&!y[2*x]){
if(x*2==e){cout<<ans<<endl;break;}
else{a.push(2*x);y[2*x]=1;}
}
a.pop();
}
}
}


#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

int main(){
int s,e;
int a[200005];//队列
int b[200005];//记录距离

while(cin>>s>>e){
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
int x=0;
int i=0;
a[0]=s;
b[s]=1;
while(1){
if(a[i]==e)
{
cout<<b[a[i]]-1<<endl;
break;
}
if(a[i]+1<=100000&&!b[a[i]+1]){
a[++x]=a[i]+1;b[a[i]+1]=b[a[i]]+1;
}
if(a[i]*2<=100000&&!b[a[i]*2]){
a[++x]=a[i]*2;b[a[i]*2]=b[a[i]]+1;
}
if(a[i]-1>=0&&!b[a[i]-1]){
a[++x]=a[i]-1;b[a[i]-1]=b[a[i]]+1;
}
i++;
}
}

}

#### Hdu2717 Catch That Cow(BFS) ---Java版

2017-01-25 20:42:06

#### poj入门水题--宽搜（bfs）题 1979 1562 2386 3278

2016-11-13 21:06:55

#### 【BFS】（一）抓住那头牛（poj 3278）

2017-05-01 15:59:09

#### HDU 1495 非常可乐（BFS+模拟）

2015-01-21 21:27:04

#### poj3278-两种方法的比较

2016-03-27 17:57:02

#### POJ 3278 && HDU 2717 Catch That Cow（bfs）

2015-07-13 10:36:38

#### POJ 3278 Catch That Cow（BFS）

2014-01-13 19:24:25

#### 后缀数组入门——初步理解及模板

2016-07-31 16:16:58

#### POJ3278-BFS容易出现思维漏洞

2016-09-16 10:37:12

#### BFS广搜题目【经典训练题】

2016-11-03 21:27:57