问题描述:农夫John和一头逃跑的牛在同一坐标轴上,John的初始位置为N(0<N<=100,000),牛的位置为K(0<K<=100,00),假定John在追逐过程中,牛不会移动,John有两种追逐方式:1)从位置X移动X-1或者X+1需要一分钟时间;2)一分钟内,可以从位置X移动到位置2*X。问,John最少需要多少时间追到牛。
样例输入:
3 8
输出:
2
分析:
对于每一个状态进行扩展,当前位置是x,依次判断x-1,x+1,x+x三种状态有没有被扩展过,若未被扩展则加入队列中
返回的条件是从队列中取出的位置等于牛所在的位置
#include<iostream>
using namespace std;
#include<queue>
int catchcattle(int N,int K) {
queue<int>q;
bool* st = new bool[K * 2];
for (int i = 0; i < K * 2; i++) {
st[i] = 0;
}
q.push(N);
int steps = 0;
int v;
while (q.size()) {
int len = q.size();
while (len--) {
int x = q.front();
q.pop();
if (x == K) return steps;
v = x - 1;
if (st[v] == 0) {
q.push(v);
st[v] = 1;
}
v = x + 1;
if (st[v] == 0) {
q.push(v);
st[v] = 1;
}
v = x + x;
if (v > K*2) continue;
if (st[v] == 0) {
q.push(v);
st[v] = 1;
}
}
steps++;
}
return -1;
}
int main()
{
cout<<catchcattle(3 ,8);
return 0;
}