#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
queue<int>que;
int num,i,j;
int n,m,trans[100001],mark[100001];
int bfs(int n,int m)
{
int N=0;
int sum=0;
if(que.front()==m)
return 0;
while(!que.empty()){
for(i=0;i<3;i++){
if(mark[que.front()+1]==0&&que.front()+1<=100000){
trans[que.front()+1]=trans[que.front()]+1;
if(que.front()+1==m){
N=1;
break;
}
else {
que.push(que.front()+1);
mark[que.back()]=1;
}
}
if(mark[que.front()-1]==0&&que.front()-1>=0){
trans[que.front()-1]=trans[que.front()]+1;
if(que.front()-1==m){
N=1;
break;
}
else {
que.push(que.front()-1);
mark[que.back()]=1;
}
}
if(mark[que.front()*2]==0&&que.front()*2<=100000){
trans[que.front()*2]=trans[que.front()]+1;
if(que.front()*2==m){
N=1;
break;
}
else {
que.push(que.front()*2);
mark[que.back()]=1;
}
}
}
que.pop();
if(N==1)
break;
}
return trans[m];
}
int main()
{
scanf("%d %d",&n,&m);
que.push(n);
mark[n]=1;
printf("%d\n",bfs(n,m));
return 0;
}
一开始没思路,看了别人的标题,知道用广度优先搜索来解,就自己写出来了;
首先要知道有三个方向,然后要用队列来存依次走过的位置,要注意的时走过的步数要靠前一步走的步数加1来解决,代码里用数组trans来记录;
用广度优先搜索来解,一旦找到cow即为最优解,既最小步数;