poj3278 bfs

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.

// https://vjudge.net/problem/POJ-3278/origin
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;

// X - 1 or X + 1 
// 2 × X
// N (0 ≤ N ≤ 100,000) 
// K (0 ≤ K ≤ 100,000) 
int book[100001];


int n,k;
int bfs(){
	memset(book,-1,sizeof(book));
	book[n]=0;
	queue<int> q;
	q.push(n); 
	while(!q.empty()){
		int tmp = q.front();
		q.pop();
		
		if(tmp==k){
			return book[k];
		} 
		if(tmp+1<=100000&&tmp<k&&book[tmp+1]==-1){
			q.push(tmp+1);
			book[tmp+1]=book[tmp]+1;
		}
		
		if(tmp-1>=0&&book[tmp-1]==-1){
			q.push(tmp-1);
			book[tmp-1]=book[tmp]+1;
		}
	
		if(tmp*2<=100000&&tmp<k&&book[tmp*2]==-1){
			
			q.push(tmp*2);
			book[tmp*2]=book[tmp]+1;
		}
	
	} 
	
	
}


int main(){
	
	cin>>n>>k;

	if(n>=k){
		cout<<n-k;
	}else
		cout<<bfs();
	
	return 0;
	
}

猜你喜欢

转载自www.cnblogs.com/chichina/p/12746060.html