题目链接 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; }