Dirección del asunto:
https://www.acwing.com/problem/content/description/1102/
El granjero conocía la ubicación de una vaca y quería atraparla. Tanto el granjero como la vaca están en la recta numérica y el granjero comienza en el punto NNN , la vaca está en el puntoKKK . El agricultor tiene dos formas de moverse:
desdeXXX se mueve aX - 1 X − 1X - 1 oX + 1 X + 1X+1. Cada movimiento toma un minuto;
desdeXXX se mueve a2 ∗ X 2 ∗ X2 ∗ X , cada movimiento toma un minuto.
Supongamos que la vaca no se da cuenta de las acciones del granjero y se detiene. ¿Cuánto tiempo le toma al granjero al menos atrapar la vaca?
Formato de entrada:
una línea, que contiene dos números enteros NNN yKKK .
Formato de
salida : genera un número entero, que indica el tiempo mínimo que se tarda en atrapar una vaca.
Rango de datos:
0 ≤ N, K ≤ 1 0 5 0≤N, K≤10 ^ 50≤N ,K≤1 05
La idea es BFS. Se puede realizar una optimización adecuada, por ejemplo, si la posición actual xxx es mayor o igual quekkk , no es necesario expandirx + 1 x + 1al expandirX+1 suma2 x 2x2 x , porque después de la expansión,hay querestar1 11 Ir hacia la izquierda desperdiciará tus pasos en vano; además, no necesitas expandir el número negativo, porque tienes que sumar1 1después de la expansión.1 Ir a la derecha es una pérdida de pasos. el código se muestra a continuación:
#include <iostream>
#include <queue>
using namespace std;
const int N = 2e5 + 10;
int n, k;
queue<int> q;
bool st[N];
int bfs(int n, int k) {
if (n == k) return 0;
int res = 0;
q.push(n);
st[n] = true;
while (!q.empty()) {
res++;
int size = q.size();
for (int i = 0; i < size; i++) {
int t = q.front();
q.pop();
if (t == k) return res;
// 不拓展负数
if (!st[t - 1] && t - 1 >= 0) {
if (t - 1 == k) return res;
q.push(t - 1);
st[t - 1] = true;
}
// 只有t < k的时候才拓展t + 1和2 * t
if (t < k) {
if (!st[t + 1]) {
if (t + 1 == k) return res;
q.push(t + 1);
st[t + 1] = true;
}
if (!st[t * 2]) {
if (t * 2 == k) return res;
q.push(t * 2);
st[t * 2] = true;
}
}
}
}
// 显然题目一定有解,所以这一行是走不到的
return -1;
}
int main() {
cin >> n >> k;
cout << bfs(n, k) << endl;
return 0;
}
La complejidad del tiempo y el espacio depende de datos específicos.