题目大意
在一条笔直的道路上,农民要捉牛,给出农民和牛的位置,牛不动,农民有三种方式可以走,例如农民在5,牛在17. 农民可以倍数级走,5*2。可以向前走一步5+1, 向后走一步5-1,每一种方式都花费一分钟,问最少花费的时间可以捉到牛。
思路
这是一道典型的广搜题,核心是使用一个一维数组,用它的下标记录农民所在位置,用它下标所对应的值来记录它所花费的时间,将每次的下标入队这里不用循环是因为农民三次的移动判断条件互不相同,每到一个位置,就将上个位置所有的时间加1赋值给它。
代码
# include <stdio.h>
# include <string.h>
# include <queue>
using namespace std;
int n,m, ans;
int num[100005];
int main(void)
{
while(~scanf("%d%d", &n, &m))
{
queue<int> Q;
Q.push(n);
num[n] = 1;
while(Q.size())
{
int c = Q.front();
if(c == m)
{
ans = num[c];
break;
}
Q.pop();
if(!num[c-1] && c-1>=0)
{
num[c-1] = num[c] + 1;
Q.push(c-1);
}
if(!num[c+1] && c+1<=100000)
{
num[c+1] = num[c] +1;
Q.push(c+1);
}
if(!num[c*2] && c*2<=100000)
{
num[c*2] = num[c] +1;
Q.push(c*2);
}
}
printf("%d",ans-1);
}
return 0;
}