题目链接 POJ3248
#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int s,e,p,k,n,pre[210000]; //pre数组 记录父节点
char vis[210000];
ll bfs()
{
queue<int> que;
que.push(s);
while(!que.empty())
{
p=que.front();
que.pop();
if(p==e)
{
ll ans=0;
while(1)
{
if(p==s) //当父节点为起始点时,回溯结束
break;
ans++; //统计路径的节点个数
p=pre[p]; //不断回溯父节点
}
return ans;
}
//三种决策方式
if(p<e&&!vis[2*p]) //p增大有2*p, 和p+1两种方式
{
vis[2*p]=1;
pre[2*p]=p;
que.push(2*p);
}
if(p<e&&!vis[p+1])
{
vis[p+1]=1;
pre[p+1]=p;
que.push(p+1);
}
if(p>=1&&!vis[p-1]) //p减小能通过p-1
{
vis[p-1]=1;
pre[p-1]=p;
que.push(p-1);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
memset(vis,0,sizeof(vis));
s=n;
e=k;
ll ans=bfs();
cout<<ans<<endl;
}
return 0;
}