http://poj.org/problem?id=3278
一个数轴,点初始在N(0 ≤ N ≤ 100,000),有两种移动方式
1.当前在X,下一秒在X+1或X-1
2.当前在X,下一秒在2*X
最短多久到达K?
不用复杂话,共有3种移动方式,全部进行一次入队就好了。
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int maxn=1000001;
int n,k;
struct Node{
int dis;
int step;
};
bool vis[maxn];
int main(){
cin >> n >> k;
memset(vis,false,sizeof(vis));
queue <Node> q;
Node Now;
Now.dis=n;
Now.step=0;
vis[Now.dis]=true;
q.push(Now);
while (!q.empty()){
Now=q.front();
if (Now.dis==k){
cout << Now.step << endl;
return 0;
}
q.pop();
Node tmp;
tmp.dis=Now.dis-1;
tmp.step=Now.step+1;
if (tmp.dis>=0&&tmp.dis<=100000&&!vis[tmp.dis]){
vis[tmp.dis]=true;
q.push(tmp);
}
tmp.dis=Now.dis+1;
tmp.step=Now.step+1;
if (tmp.dis>=0&&tmp.dis<=100000&&!vis[tmp.dis]){
vis[tmp.dis]=true;
q.push(tmp);
}
tmp.dis=Now.dis*2;
tmp.step=Now.step+1;
if (tmp.dis>=0&&tmp.dis<=100000&&!vis[tmp.dis]){
vis[tmp.dis]=true;
q.push(tmp);
}
}
}