题目描述
输入
输出
示例输入
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;
}