农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上 ,农夫起始位于点 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;
}
来源:https://blog.csdn.net/qq_44781006/article/details/98882112