//题目大意:求一个数变成另一个数需要几步?给你的操作有pre+1,pre-1,pre*2.
//我们可以把这个问题转换成最短路问题,利用BFS进行。
AC代码:
#include<stdio.h> #include<string.h> #define max 100005 int n,k; int vis[max]; struct node { int x,step; } queue[max]; void bfs() { struct node now,pre; int e=0,h=1; queue[0].x=n; queue[0].step=0; while(e<h) { pre=queue[e]; if(pre.x==k) { printf("%d\n",pre.step); return; } int i; for(i=1; i<=3; i++) { if(i==1) { now.x=pre.x+1; now.step=pre.step+1; if(! vis[now.x]&&now.x<max) { vis[now.x]=1; queue[h++]=now; } } if(i==2) { now.x=pre.x-1; now.step=pre.step+1; if(! vis[now.x]&&now.x<max) { vis[now.x]=1; queue[h++]=now; } } if(i==3) { now.x=pre.x*2; now.step=pre.step+1; if(! vis[now.x]&&now.x<max) { vis[now.x]=1; queue[h++]=now; } } } e++; } } int main() { while(scanf("%d%d",&n,&k)!=EOF) { memset(vis,0,sizeof(vis)); bfs(); } }