比较简单的搜索,不过我的内存开得太大了,不知道怎么缩减
一开始内存开得太小了,忘了可能有一步是X*2,所以总数值可能大于100000,所以RE了
#include<iostream>
#include<string>
#include<queue>
using namespace std;
int n,k;
int vis[200002];
struct node
{
int x,cnt;
node(int _x=0,int _cnt=0):x(_x),cnt(_cnt){};
};
queue<node> Q;
void bfs()
{
memset(vis,0,sizeof(vis));
node f;
f.x=n;f.cnt=0;
while(!Q.empty())
Q.pop();
Q.push(f);
vis[f.x]=1;
while(!Q.empty())
{
node t=Q.front();
Q.pop();
if(t.x==k)
{
cout<<t.cnt<<endl;
return;
}
if(t.x>k&&!vis[t.x-1])//若t.x>k,则不可能在加1或者乘以2
{
Q.push(node(t.x-1,t.cnt+1));
vis[t.x-1]=1;
continue;
}
if(t.x*3<=2*k)//原形是这样的,t.x*2-k<=k-t.x
{
if(!vis[t.x*2])
{
Q.push(node(t.x*2,t.cnt+1));
vis[t.x*2]=1;
}
}
if(!vis[t.x-1])
{Q.push(node(t.x-1,t.cnt+1));
vis[t.x-1]=1;}
if(!vis[t.x+1])
{vis[t.x+1]=1;
Q.push(node(t.x+1,t.cnt+1));}
}
}
int main()
{
while(cin>>n>>k)
{
if(n>k)
{ cout<<n-k<<endl;continue;}
bfs();
}
return 0;
}