C - Catch That Cow

被刻印的时光 ゝ 提交于 2019-11-26 13:56:37

农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<=K<=100000) 。农夫有两种移动方式:
1、从 X移动到 X-1或X+1 ,每次移动花费一分钟
2、从 X移动到 2*X ,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。最少要花多少时间才能抓住牛?
Input
一行: 以空格分隔的两个字母:N和K
Output
一行: 农夫抓住牛需要的最少时间,单位分钟
Sample Input
5 17
Sample Output
4
Hint
农夫使用最短时间抓住牛的方案如下: 5-10-9-18-17, 需要4分钟 .

卡了几次Time Limit ,题目就是简单的广搜,只是要注意限制X移动到 2X入队列的条件,让入队列的点在终点(牛位置)+2以内,超过这个范围的点X一般可以用-1再2的操作到终点。

AC代码

#include"iostream"
#include"string.h"
#include"queue"
#include"algorithm"
using namespace std;
int y;
int map[100005];
struct t
{
	int x,time;
};
void BFS(t a)
{
	queue<t> q;
	t now,next;
	q.push(a);
	map[a.x]=1;
	while(!q.empty())
	{
		now=q.front();
		q.pop();
		if(now.x==y)
		{
			cout<<now.time<<endl;
			return;
		}
		else
		{
			next.x=now.x+1;
			if(next.x>=0&&next.x<y+2&&map[next.x]==0)
			{
				next.time=now.time+1;
				q.push(next);
				map[next.x]=1;
			}
			next.x=now.x-1;
			if(next.x>=0&&next.x<y+2&&map[next.x]==0)
			{
				next.time=now.time+1;
				q.push(next);
				map[next.x]=1;
			}
			next.x=now.x*2;
			if(next.x>=0&&next.x<y+2&&map[next.x]==0)
			{
				next.time=now.time+1;
				q.push(next);
				map[next.x]=1;
			}
		}
	}
}
int main()
{
	t b;
	while(cin>>b.x>>y)
	{
		b.time=0;
		if(b.x>=y)
		{
			cout<<b.x-y<<endl; 
		}
		else
		{
			memset(map,0,sizeof(map));
			BFS(b);
		}	
	}
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!