题目衔接:http://poj.org/problem?id=3278
代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define maxn 200000+10
int data[maxn];
bool visited[maxn];
queue<int> store;
int bfs(int N,int K)
{
while(!store.empty())
store.pop();
memset(data,0,sizeof(data));
memset(visited,false,sizeof(visited));
int parent,child;
store.push(N);
visited[N] = true;
data[N] = 0;
while(!store.empty())
{
parent = store.front();
store.pop();
for(int i=0;i<3;i++) //遍历三种情况
{
if(i == 0)
child = parent - 1;
else if(i == 1)
child = parent +1;
else
child = 2*parent;
if(child > maxn || child < 0) //越界剪枝
continue;
if(!visited[child])
{
visited[child] = true;
store.push(child);
data[child] = data[parent]+1;
}
if(child == K)
return data[child];
}
}
return 0;
}
int main()
{
int N,K;
cin>>N>>K;
if(N>=K)
cout<<N-K<<endl;
else
cout<<bfs(N,K)<<endl;
return 1;
}