您的位置:首页 > 其它

G - Catch That Cow

2017-01-19 21:45 337 查看
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.

题目讲让你用广搜

需要注意特殊情况,当famer 和cow在一起时

|

#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
bool vis[100002];
int N, K, step;
int dir[2] = {1, -1};
int path[100002];
queue <int> Q;

void bfs(){
while(!Q.empty()){
int now = Q.front();
Q.pop();
for(int i = 0; i < 3; i++){ //将走的方式看作是一种方向,那么题目就可以转变为BFS
int tt;
if(i == 2){
tt = now * 2;
}
else{
tt = now + dir[i];
}
if(tt > 0 && tt < 100001 && !vis[tt]){  //判断方式很简单,只要是在图的范围内并且没有访问过就可以了
if(tt == K){
cout << path[now]+1 << endl;
return;
}
vis[tt] = true;
path[tt] = path[now] + 1; //这里用来记录步数,走到第i个点用论文path[i]步,那么从i到下一个点就用了path[i]+1步
Q.push(tt);
}
}
}
}

int main(){
ios::sync_with_stdio(false);
memset(path, 0, sizeof(path));
memset(vis, false, sizeof(vis));

cin >> N >> K;
if(N >= K){ //当cow的位置比john小时候,john只有向后退才会离cow越来越近,只有-1的方式能用,所以直接相减就行了。
cout << N - K << endl;
}
else{
Q.push(N);
vis
= true;
bfs();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs 算法 搜索