http://poj.org/problem?id=3278
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
using namespace std;
#define maxn 100005
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define ULL unsigned long long
bool used[maxn];
typedef struct
{
int x,step;
}Point;
bool overwall(int x)
{
if(x<0||x>=maxn)
return true;
else
return false;
}
void bfs(int n,int k)
{
Point t,p;
t.step=0;
t.x=n;
used[t.x]=true;
queue <Point> q;
q.push(t);
int b[3][2]={{1,0},{-1,0},{0,1}};
while (!q.empty()) {
p=q.front();
q.pop();
if(p.x==k)
{
cout<<p.step<<endl;
break;
}
for(int i=0;i<3;i++)
{
t=p;
t.x=t.x+b[i][0]+t.x*b[i][1];
if(!overwall(t.x)&&!used[t.x])
{
t.step++;
q.push(t);
used[t.x]=true;
}
}
}
}
int main()
{
int N,K;
while (cin>>N>>K) {
memset(used,0,sizeof(used));
bfs(N,K);
}
return 0;
}