题解:题意简单,看见最少直接用bfs。三个状态,然后就是要减枝了,首先如果当前的数大于m的值就只用-就可以了,当然不能为0。
#include<stdio.h>
#include<string.h>
using namespace std;
struct node
{
int x;
int cost;
};
short vis[200050];
struct node que[200050];
int main()
{
int n,m;
int head,fail;
int i,j;
int ans=0;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==m){
printf("0\n");
continue;
}
memset(vis,0,sizeof(vis));
ans=0;
head=0;
fail=1;
que[0].x=n;
que[0].cost=0;
while(fail<200050)
{
if(que[head].x<m&&vis[que[head].x+1]==0)
{
vis[que[head].x+1]=1;
que[fail].x=que[head].x+1;
que[fail].cost=que[head].cost+1;
if(que[fail].x==m)
{
ans=que[fail].cost;
break;
}
fail++;
}
if(que[head].x-1>=0&&vis[que[head].x-1]==0)
{
vis[que[head].x-1]=1;
que[fail].x=que[head].x-1;
que[fail].cost=que[head].cost+1;
if(que[fail].x==m)
{
ans=que[fail].cost;
break;
}
fail++;
}
if(que[head].x<m&&vis[que[head].x*2]==0)
{
vis[que[head].x*2]=1;
que[fail].x=que[head].x*2;
que[fail].cost=que[head].cost+1;
if(que[fail].x==m)
{
ans=que[fail].cost;
break;
}
fail++;
}
head++;
}
printf("%d\n",ans);
}
}