toj3071 BFS_模板

来源:互联网 发布:空总激光美容中心 知乎 编辑:程序博客网 时间:2024/06/05 07:56

//toj3071number game BFS--典型bfs,分别有加一减一和乘除的操作,因此用bfs先操作一下,如果成功进入队列,

最终找到最小的步骤

#include<iostream>#include<cstring>#include<memory.h>#define MAX 100000using namespace std;int main(){   int cases,k,p,flag[MAX+1],i;   int step[MAX+1],x[MAX+1],tx,top;   int mark;   cin>>cases;   while(cases--)   {      cin>>k>>p;      memset(flag,0,sizeof(flag));      mark=0;      top=1;      x[0]=k;      step[0]=0;      for(i=0;i<top;i++)      {          if(x[i]==p)               {cout<<step[i]<<endl;mark=1;break;}          tx=x[i]*2;          if(tx<MAX&&flag[tx]==0)          {              x[top]=tx;              step[top]=step[i]+1;              flag[tx]=1;              top++;                               }          if(x[i]%2==0)               {             tx=x[i]/2;             if(tx>0&&flag[tx]==0)             {                 x[top]=tx;                 step[top]=step[i]+1;                 flag[tx]=1;                 top++;                                   }            }            tx=x[i]+1;          if(tx<MAX&&flag[tx]==0)          {              x[top]=tx;              step[top]=step[i]+1;              flag[tx]=1;              top++;                               }           }      if(mark==0)cout<<-1<<endl;                }    return 0;   }