这是个经典的bfs题目,如果不剪枝在vjudge上提交会TLE,其实在n>=k时只要输出n-k就行了,这样就AC了。
#include <cmath>
#include<queue>
#include <cstring>
#include <cstdio>
#include <map>
#include <iostream>
#include <vector>
#include<cmath>
#define rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
struct status
{
int pos,step;
};
//int vis[100009];
int main()
{
int n,k;
while(cin>>n>>k)
{
if(n>k)cout<<n-k<<endl;
else
{
status start,End;
start.pos=n;start.step=0;
End.pos=k;End.step=-1;
queue<status>que;
while(!que.empty())que.pop();
que.push(start);
int ans=-1;
//memset(vis,0,sizeof(vis));
map<int ,int>vis;
while(!que.empty())
{
//cout<<1;
status now =que.front();
que.pop();
//cout<<now.pos<<endl;
if(now.pos==End.pos)
{
ans=now.step;
break;
}
if(now.pos+1<=100009&&vis[now.pos+1]==0)
{
vis[now.pos+1]=1;
status t;
t.pos=now.pos+1;
t.step=now.step+1;
que.push(t);
}
if(now.pos-1>=0&&vis[now.pos-1]==0)
{
vis[now.pos-1]=1;
status t;
t.pos=now.pos-1;
t.step=now.step+1;
que.push(t);
}
if(now.pos*2<=100009&&vis[now.pos*2]==0)
{
vis[now.pos*2]=1;
status t;
t.pos=now.pos*2;
t.step=now.step+1;
que.push(t);
}
}
cout<<ans<<endl;
}
}
}