题目链接:http://www.jxsfczx.cn:888/problem/37
时间:1 秒 空间:512 MB
题目描述
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入描述
两个整数,N和K。
输出描述
一个整数,农夫抓到牛所要花费的最小分钟数。
输入
5 17
输出
4
解题思路
BFS搜索。
#include <bits/stdc++.h>
using namespace std;
struct edge {
int x, l;
}u;
int vis[150005], arr[2] = {1, -1};
int BFS(int s, int t) {
int tx;
vis[s] = 1;
queue <edge> Q;
Q.push((edge){s, 0});
while (!Q.empty()) {
u = Q.front();
Q.pop();
for (int i = 0; i < 3; i++) {
if (!i)
tx = u.x << 1;
else tx = u.x + arr[i - 1];
if (tx < 0 || tx > 150000 || vis[tx])
continue;
if (!(tx - t))
return u.l + 1;
Q.push((edge){tx, u.l + 1});
vis[tx] = 1;
}
}
return -1;
}
int main() {
int s, t;
scanf("%d%d", &s, &t);
printf("%d\n", BFS(s, t));
return 0;
}