题目描述
输入
输出
示例输入
5 17 
示例输出
4 
提示
 
 
 题意:有一个农民和一头牛,他们在一个数轴上,牛在k位置保持不动,
 农户开始时在n位置。设农户当前在M位置,每次移动时有三种选择:
 1.移动到M-1;2.移动到M+1位置;3.移动到M*2的位置。
 问最少移动多少次可以移动到牛所在的位置。所以可以用广搜
 来搜索这三个状态,直到搜索到牛所在的位置。
 #include <iostream>
 #include<cstdio>
 #include<cstdlib>
 #include<cstring>
 #include<queue>
 #define INF 0x3f3f3f3f
 #define max 200001
 using namespace std;
 struct node
 {
     int step;//查找的步数;
     int x;//记录位置;
 }a,b;
 int v[200001];//标记数组;
 int c(int x)
 {
     if(x<0||x>=max||v[x])//查找不到。
         return 0;
     return 1;
 }
 int n,m;
 int bfs(int n)
 {
     queue<node>q;//结构体进队;
     a.x=n;//农户开始的位置;
     a.step=0;
     v[a.x]=1;
     q.push(a);
     while(!q.empty())
     {
         a=q.front();
         q.pop();
         if(a.x==m)//找到牛的位置;
             return a.step;
         b=a;
         if(c(a.x+1))//向前一步走;
         {
             b.x=a.x+1;
             b.step=a.step+1;
             v[a.x+1]=1;//标记走过;
             q.push(b);
         }
         if(c(a.x-1))//向后一步走;
         {
             b.x=a.x-1;
             b.step=a.step+1;
             v[a.x-1]=1;
             q.push(b);
         }
         if(c(a.x*2))
         {
             b.x=a.x*2;
             b.step=a.step+1;
             v[a.x*2]=1;
             q.push(b);
         }
     }
     return 0;
 }
 int main()
 {
     while(~scanf("%d%d",&n,&m))
     {
         memset(v,0,sizeof(v));//初始化;
         printf("%d\n",bfs(n));
     }
     return 0;
 }