poj3278广搜

题意:从一个数通过可以通过-1,+1,*2等变换操作得到另一个数的最少步数;
解法:广搜

#include
#include
using namespace std;

struct point
{
    int num;
    int steps;
};
point points[1000000];
bool rem[1000100];
int start,en;
bool OK(int i)
{
    returnpoints[i].num==en;
}
int main()
{
    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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值