经过+1,-1,*2的操作,使第一个数等于第二个数
求最少步骤都是用的广搜
#include<stdio.h> #include<queue> #include<string.h> using namespace std; const int MAXN=100010; int step[MAXN],vis[MAXN]; queue<int>Q; int BFS(int n,int k) { int next,head; step[n]=0; vis[n]=1; Q.push(n); while(!Q.empty()) { head=Q.front(); Q.pop(); for(int i=0;i<3;i++) { if(i==0) next=head-1; else if(i==1) next=head+1; else next=head*2; if(next>MAXN || next<0) continue; if(!vis[next]) { vis[next]=1; Q.push(next); step[next]=step[head]+1; } if(k==next) return step[next]; //广搜搜索的深度第一次相等的就是深度最小的那个支结点,所以没必要再比较哪个最少了 } } } int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF) { memset(vis,0,sizeof(vis)); if(n>=k) printf("%d\n",n-k); else printf("%d\n",BFS(n,k)); } return 0; }