广度优先搜索算法。另:可以写一个简单的输出队列所有元素的函数。

struct cow{
    int p;
    int t;
    cow(int p,int t):p(p),t(t){}
};

int BFS(int p,int q){
    queue<cow>cowqueue;
    int tag[100000];
    for(int i=0;i<100000;i++)tag[i]=0;
    cowqueue.push(cow(p,0));
    while(!cowqueue.empty()){
        cow tmp=cowqueue.front();
        if (tmp.p==q)return tmp.t;
        cowqueue.pop();
        for(int i=0;i<3;i++){
            //创造新的cow对
            cow newcow(tmp.p,tmp.t+1);
            if(i==0)newcow.p-=1;
            else if(i==1)newcow.p+=1;
            else newcow.p*=2;
            //如果没有越界且未访问,则记录下来,并且进入队列
            if (tag[newcow.p]==1||newcow.p>=100000)continue;
            tag[newcow.p]=1;
            cowqueue.push(newcow);
        }
    }
    return -1;
}

int main(){
    int p,q;
    scanf("%d%d",&p,&q);
    int time=BFS(p,q);
    cout<<time<<endl;
    return 0;
}

输出队列所有元素的函数:

void printcow(cow c){
    printf("(%d,%d)",c.p,c.t);
}

void printqueue(queue<cow>q){
    for(int i=0;i<q.size();i++){
        cow tmp=q.front();
        printcow(tmp);
        q.pop();
        q.push(tmp);
    }
}