题意:给定坐标上的两个点 N (0 ≤ N ≤ 100,000),K (0 ≤ K ≤ 100,000),问从 N 出发每次采取三种走法之一( N-1; N + 1;N * 2 ),每一步消耗1 min。问消耗的最少时间是多少?
#pragma warning (disable:4786)
#include<iostream>
#include<queue>
using namespace std;
int visited[300000]; /广搜中标记是否已经入过队
int n, k;
void BFS(){
queue<int> q; /广搜队列
int temp, size = 1; /当前访问的层剩余的队中元素数
int temp_size = 0; /当前访问层衍生出来的新的一层的元素数
int level = 1; /当前访问层的层高
if( n == k ){
printf("0\n");
return;
}
q.push(n);
visited[n] = 1;
while( 1 ){
//切换新层时做的更新
if( size == 0 ){
size = temp_size;
temp_size = 0;
level ++;
}
temp = q.front();
q.pop();
size --;
int result;
if( 2 * k >= 3 * temp ){ /剪枝
result = temp * 2;
if( !visited[result] ){
if( result == k ){
printf( "%d\n", level );
break;
}
visited[result] = 1;
q.push( result );
temp_size ++;
}
}
if( temp < k ){
result = temp + 1;
if( !visited[result] ){
if( result == k ){
printf( "%d\n", level );
break;
}
visited[result] = 1;
q.push( result );
temp_size ++;
}
}
if( temp > 0 ){
result = temp - 1;
if( !visited[result] ){
if( result == k ){
printf( "%d\n", level );
return;
}
visited[result] = 1;
q.push( result );
temp_size ++;
}
}
}
}
int main(){
scanf( "%d%d", &n,&k );
BFS();
return 0;
}