题意:从一个数通过可以通过-1,+1,*2等变换操作得到另一个数的最少步数;
int num;
int steps;
returnpoints[i].num==en;
int pL,pR;
while(cin>>start>>en)
{
memset(rem,0,sizeof rem);
if(start>=en){cout<<start-en<<endl;continue;}
pL=0,pR=1;
points[0].steps=0;points[0].num=start;
rem[start]=1;
while(pL
{
if(points[pL].num>en*2||points[pL].num<0){pL++;continue;}
//cout<<endl<<pL<<""<<points[pL].num<<endl;cout<<1;
if(!rem[points[pL].num-1]){
points[pR].num=points[pL].num-1;points[pR].steps=points[pL].steps+1;
if(OK(pR)){cout<<points[pR].steps<<endl;break;}
pR++;rem[points[pL].num-1]=1;
}
if(!rem[points[pL].num+1]){
points[pR].num=points[pL].num+1;points[pR].steps=points[pL].steps+1;
if(OK(pR)){cout<<points[pR].steps<<endl;break;}
pR++;rem[points[pL].num+1]=1;
}
if(!rem[points[pL].num*2]){
points[pR].num=points[pL].num*2;points[pR].steps=points[pL].steps+1;
if(OK(pR)){cout<<points[pR].steps<<endl;break;}
pR++;rem[points[pL].num*2]=1;
}
pL++;
}
}
return 0;
解法:广搜
#include
#include
using namespace std;
struct point
{
};
point points[1000000];
bool rem[1000100];
int start,en;
bool OK(int i)
{
}
int main()
{
}