http://poj.org/problem?id=3278
注意://注意了!两个相关判断,vis数组范围注意。先判断em.n<110000才能看vis,否则越界
bfs模板,不是数学问题的,与每次多跳一格有这个技巧不同
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
int k;
struct node{
int n,t;
}s,em;
int vis[110005]={0};//0未1有
int bfs(void){
queue<node>q;
s.t=0;
vis[s.n]=1;
q.push(s);
while(!q.empty()){
s=q.front();
q.pop();
if(s.n==k)return s.t;
em.t=s.t+1;//下一个
//x-1
em.n=s.n-1;
if(vis[em.n]==0&&em.n>=0){
vis[em.n]=1;
q.push(em);
}
if(s.n<k)
{
//x+1
em.n=s.n+1;
if(em.n<110000&&vis[em.n]==0){//注意了!两个相关判断,vis数组范围注意。先判断em.n<110000才能看vis,否则越界
vis[em.n]=1;
q.push(em);
}
//2x
em.n=2*s.n;
if(em.n<110000&&vis[em.n]==0){
vis[em.n]=1;
q.push(em);
}
}
}
}
int main()
{
scanf("%d%d",&s.n,&k);
printf("%d",bfs());
return 0;
}