这是一道广搜的模板题,我就不解释了。直接看代码;
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<queue> #include<map> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define MAXN 100000 using namespace std; int vis[MAXN+10],n,k; struct node { int x,s; node(int xx,int sx):x(xx),s(sx){ } // 结构体函数,初始化。 }; void bfs(int n) { queue<node>q; q.push(node(n,0)); // 将起始点入队。 vis[n]=1; while(!q.empty()){ node next=q.front(); q.pop(); if(next.x==k){ // 说明找到了。。。printf("%d ",next.s); return; } if((next.x+1)<=MAXN&&!vis[next.x+1]) q.push(node(next.x+1,next.s+1)), vis[next.x+1]=1; // 三种情况,可行则分别入队;并标记。 if((next.x-1)>=0&&!vis[next.x-1]) q.push(node(next.x-1,next.s+1)), vis[next.x-1]=1; if((next.x*2)<=MAXN&&!vis[next.x*2]) q.push(node(next.x*2,next.s+1)), vis[next.x*2]=1; } return; } int main() { while(~scanf("%d%d",&n,&k)){ memset(vis,0,sizeof(vis)); bfs(n); } return 0; }