http://noi.openjudge.cn/ch0205/2971/
通过广搜,本题一定有解的,且是最优解。
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <queue>
using namespace std;
#define max 100000
bool flag[max + 10];
int N, K;
struct Node {
int x;
int steps;
Node(int xx, int ss): x(xx),steps(ss) {
};
};
queue<Node> queues;
int main() {
scanf("%d%d", &N, &K);
queues.push(Node(N, 0));
flag[N] = 1;
while (!queues.empty()) {
Node n = queues.front();
if (n.x == K) {
printf("%d", n.steps);
break;
}
if (n.x - 1 >= 0&& !flag[n.x - 1]) {
queues.push(Node(n.x - 1, n.steps + 1));
flag[n.x-1] = 1;
}
if (n.x + 1 <= max && !flag[n.x + 1]) {
queues.push(Node(n.x +1, n.steps + 1));
flag[n.x+1] = 1;
}
if (n.x * 2 <= max && !flag[n.x*2]) {
queues.push(Node(n.x*2, n.steps + 1));
flag[n.x*2] = 1;
}
queues.pop();
}
return 0;
}