水题,搜索一个数转化成另一个数。
1 #include2 #include 3 #include 4 using std::queue; 5 #define N 100010 6 int d[N]; 7 bool vis[N]; 8 int m,n,a; 9 int nxt(int x)10 {11 int t;12 if(x==0) t = a-1;13 else if(x==1) t=a+1;14 else t = a<<1;15 return t;16 }17 int bfs()18 {19 if(m==n) return 0;20 int b,i;21 memset(vis,0,N);22 queue q;23 q.push(m);24 d[m] = 0;25 vis[m] = 1;26 while(!q.empty())27 {28 a = q.front();29 q.pop();30 for(i = 0; i < 3; i++)31 {32 b = nxt(i);33 if(b >= 0 && b <= 100000 && !vis[b])34 {35 if(b == n) return d[a]+1;36 q.push(b);37 vis[b] = 1;38 d[b] = d[a]+1;39 }40 }41 }42 return -1;43 }44 int main()45 {46 while(~scanf("%d%d",&m,&n))47 printf("%d\n",bfs());48 return 0;49 }