农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000)。农夫有两种移动方式:
1、从X移动到X−1或X+1,每次移动花费一分钟
2、从X移动到2×X,每次移动花费一分钟
假设牛没有意识到农
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX = 1000001;
int n = 0;//人的位置
int k = 0;//牛的位置
int cur = 0;//人移动后的位置
int ret = 0;//最终的分钟数
int coun[MAX];//记录最小的分钟数,且标记是否重复
int d[3];//实现三种状态
queue<int> open;
void dfs()
{
fill(coun, coun + MAX, -1);//实现范围赋值
open.push(n);
coun[n] = 0;
while (!open.empty())
{
cur = open.front();//入队列
open.pop();//出队列
if (cur == k)//当找到后,退出循环
{
break;
}
//三种状态
d[0] = cur - 1;
d[1] = cur + 1;
d[2] = cur * 2;
for (int i = 0; i < 3; i++)
{
if (d[i] >= 0 && d[i] <= MAX && coun[d[i]] == -1)//判断是否越界,是否重复
{
open.push(d[i]);
coun[d[i]] = coun[cur] + 1;
}
}
}
ret = coun[k];
cout << ret << endl;
}
int main()
{
cin >> n >> k;
dfs();
return 0;
}
夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?