广度优先搜索算法。另:可以写一个简单的输出队列所有元素的函数。
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);
}
}