数字的简单BFS,给定起点终点和方式,可以对这个数字进行+1,-1,*2,因为k的范围是0-100000,所以数组起码开20W,小于0的情况直接不考虑。注意越界问题...
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
int used[300020];
int n,k;
struct node
{
int num,t;
};
int ok(int x)
{
if(x<0||x>200000)//越界
return 0;
if(used[x]==1)
return 0;
return 1;
}
int bfs()
{
queue<node> q;
node now,next;
now.num=n,now.t=0;
q.push(now);
memset(used,0,sizeof(used));
used[now.num]=1;
while(!q.empty())
{
now=q.front();
q.pop();
if(now.num==k)
return now.t;
next.num=now.num-1;
next.t=now.t+1;
if(ok(next.num))
{
q.push(next);
used[next.num]=1;
}
next.num=now.num+1;
next.t=now.t+1;
if(ok(next.num))
{
q.push(next);
used[next.num]=1;
}
next.num=now.num*2;
next.t=now.t+1;
if(ok(next.num))
{
q.push(next);
used[next.num]=1;
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
int ans=bfs();
printf("%d\n",ans);
}
return 0;
}