直接广搜,需要注意的是两数相等时,应当直接输出0;以及数组范围100000*2。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int MAX=2e5+1;
int a[MAX];
int vis[MAX];
int ans;
void bfs(int x,int y)
{
int x1,y1,i;
int ans1,ans2;
queue<int>q;
q.push(x);
vis[x]=1;//标记已经来过了
while(!q.empty())
{
ans1=q.front();//以该点为跳板
q.pop();
for(i=0;i<=2;i++)
{
if(i==0)
x1=ans1-1;
else if(i==1)
x1=ans1+1;
else
x1=ans1*2;
if(vis[x1]!=0||x1<0||x1>100000)continue;
vis[x1]=1;
a[x1]=a[ans1]+1;//记录补数
q.push(x1);
if(x1==y)//最快达到此条件的就是步数最少的
{
printf("%d",a[x1]);
}
}
}
}
int main()
{
int i,n,m,j,k,l,x,y;
while(~scanf("%d%d",&x,&y))
{
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
if(x!=y)
{
bfs(x,y);
}
else
printf("0\n");
}
}