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

}

• 本文已收录于以下专栏：

## POJ3278 简单BFS+剪枝

• qq_35083093
• 2017年04月25日 19:49
• 84

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

Description 给定两个整数n和k,通过 n+1或n-1或n*2 这3种操作，使得n=k,输出最少的操作次数(0≤n≤100,000) Input 两个整数n和k Output 输出...
• V5ZSQ
• 2015年07月13日 10:36
• 399

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

Question: 本体是标准的三个入口的BFS水题，但是细节问题太多 Solution: 1.数组没必要太大，一旦RE了，是因为出现了这么几种情况，出现负数，因为题中声明不会有负数的出现，把负...
• ltyqljhwcm
• 2016年09月16日 10:37
• 431

## POJ 3278— 入门BFS

• u013769121
• 2015年05月11日 21:46
• 205

## poj3278-两种方法的比较

• u013700636
• 2016年03月27日 17:57
• 354

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

poj 1979，bfs，宽搜,1562 2386 1915 2243 3278
• qq_17246605
• 2016年11月13日 21:06
• 689

## 杭电 HDU 2717 Catch That Cow

Catch That Cow Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
• lsgqjh
• 2015年07月29日 00:25
• 967

## hdu 1104/poj 2426 Remainder（数论，BFS）

Remainder Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota...
• acm_cxq
• 2016年08月08日 11:09
• 463

## HDU 1548 BFS入门

【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=1548【解题报告】 从A出发，问到B的最短路径。 其实就是一个最短路问题。使用优先队列维护一下...
• gungnir0711
• 2016年03月20日 13:22
• 139

## BFS小结（持续更新中）

• ACM_cxlove
• 2012年06月05日 18:52
• 6196

举报原因： 您举报文章：HDU 2717||POJ 3278 BFS入门（理解原理） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)