二刷提高课,题解目录在这里— 提高课的题解目录
很明显当牛跳过终点后就不会再往后跳第二种了,
并且当牛处于其范围的一半时向后跳二倍再反过来走
还不如一步一步走向终点
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int N=2e5+10;
int n,k;
int q[N],dist[N];
bool bfs()
{
memset(dist,-1,sizeof dist);
int hh=0,tt=0;
q[0]=n;
dist[n]=0;
while(hh<=tt)
{
int t=q[hh++];
if(t==k)return true;
if(dist[t]>=abs(k-n))return false;
//都搜了那么久了还没找到,肯定更远处还是return了吧
if(t+1<N&&dist[t+1]==-1)dist[t+1]=dist[t]+1,q[++tt]=t+1;
if(t-1>0&&dist[t-1]==-1)dist[t-1]=dist[t]+1,q[++tt]=t-1;
if(t*2<N&&dist[t*2]==-1)dist[2*t]=dist[t]+1,q[++tt]=2*t;
}
return false;
}
int main()
{
cin>>n>>k;
if(bfs())cout<<dist[k];
else cout<<abs(k-n);
return 0;
}