Catch That Cow(bfs启蒙题)

Catch That Cow

百练4001


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 - 1 or + 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.

代码:

#include<iostream> 
#include<cstdio>
#include<queue>
using namespace std;
int ha[100010]={0};//标记走过的点 
struct po//每个点的状态:位置,走到这个点的步数 
{
	int x;
	int steps;
	po(int xx,int step):x(xx),steps(step){}//构造函数 
};
void bfs(int n,int k);
queue<po> q;//用来储存点的队列 

int main(void)
{
	int n,k;
	scanf("%d %d",&n,&k);
	bfs(n,k);
	return 0;
}
void bfs(int n,int k)
{
	q.push(po(n,0));//把起点入队列 
	ha[n]=1; //并标记起点已经来过 
	while(!q.empty())//如果队列非空的话就继续扩展新的点 
	{
		po qi=q.front();//取出队列最前面的点(先进先出) 
		q.pop();//弹出 
		if(qi.x==k)//如果到达目标 
		{
			printf("%d",qi.steps);//输出步数(一定是最短的) 
			return;
		}
		//接下来是扩展在目前的位置经过一步所能到达的点 
		//可以把每一步的扩展写成一个结构体如:
//		struct
//		{
//			int x,y;
//		}dir[4]={{1,0},{0,1},{-1,0},{0,-1}};
		if(qi.x-1>=0&&ha[qi.x-1]==0)//判断下一步的点有没有走过,并进行剪枝
		                            //(判断如果进行下一步的话是否可能接近目标,或是永远都不能到达目标) 
		{
			q.push(po(qi.x-1,qi.steps+1));
			ha[qi.x-1]=1;
		}
		if(qi.x+1<=k&&ha[qi.x+1]==0)
		{
			q.push(po(qi.x+1,qi.steps+1));
			ha[qi.x+1]=1;
		}
		if(qi.x<=k&&qi.x*2<=100000&&ha[qi.x*2]==0)//越界判断等 
		{
			q.push(po(qi.x*2,qi.steps+1));
			ha[qi.x*2]=1;
		}
	}
	//如果队列为空时还没有到达目标则表明无解 
	return;
}

//bfs一般模版
 
//bfs()
//{
//	while(!q.empty()) 
//	{
//		if()//到达目标 
//		{
//			//
//			break;	
//		}
//		//扩展 
//	}
//	//
//} 


猜你喜欢

转载自blog.csdn.net/nucleare/article/details/80042375