catch the cow(poj-3728)

Catch That Cow
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 98735 Accepted: 30980

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 - 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.


  • 题目大意:

一个人和一头牛,分别站在N位置和K位置,牛是不动的,人可以有三种方式移动:X-1、X+1、2*X,问最短多少步可以抓住牛。

  • 解题思路:

广搜的题,需要注意几点——

①牛可能在人左边。

②用了address数组记录人到过的位置,防止重复搜索。

③小于0的,大于100000的直接忽略。

  • 代码如下:


import java.util.*;
public class Main
{
	public static int n,m;
	public static final int MAX = 100003;
	public static int[] address = new int[MAX+1];
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		n = in.nextInt();
		m = in.nextInt();
		System.out.println(bfs());
	}
	public static int bfs()
	{
		Queue<Step>q = new LinkedList();
		q.add(new Step(n,0));
		while(true)
		{
			Step tem = q.peek();
			if(tem.x==m)return tem.id;
			q.poll();
			if(tem.x-1>=0 && address[tem.x-1]==0)
			q.add(new Step(tem.x-1,tem.id+1));
			if(tem.x+1<=MAX && address[tem.x+1]==0)
			q.add(new Step(tem.x+1,tem.id+1));
			if(tem.x*2<=MAX && address[tem.x*2]==0)
			q.add(new Step(tem.x*2,tem.id+1));
		}
	}
	public static class Step
	{
		int x;
		int id;
		public Step(int x,int id)
		{
			this.id = id;
			this.x = x;
			address[x]=1;
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值