题目点我
简单的bfs,但是要剪枝。结果在剪枝数字的问题上RE了一万次,腿都软了。
#include <cstdio>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
#define maxn 200005
int step[maxn];
char vis[maxn];
int bfs(int N, int K){
if(N == K) return 0;
memset(vis, 'w', sizeof(vis));
queue<int> Q;
Q.push(N);
step[N] = 0;
vis[N] = 'g';
while(!Q.empty()){
int x = Q.front();
int now;
Q.pop();
vis[x] = 'b';
if(vis[x - 1] == 'w' && (x - 1 >= 0)){
if(x - 1 == K)
return step[x] + 1;
now = x - 1;
step[now] = step[x] + 1;
Q.push(now);
vis[now] = 'g';
}
if(vis[x + 1] == 'w' && (x + 1 <= maxn/2)){
if(x + 1 == K)
return step[x] + 1;
now = x + 1;
step[now] = step[x] + 1;
Q.push(now);
vis[now] = 'g';
}
if(vis[x * 2] == 'w' && (x * 2 <= maxn/2)){
if(x * 2 == K)
return step[x] + 1;
now = x * 2;
step[now] = step[x] + 1;
Q.push(now);
vis[now] = 'g';
}
}
return -1;
}
int main(){
int N, K;
while(scanf("%d %d", &N, &K) != EOF){
printf("%d\n", bfs(N, K));
}
return 0;
}