加一乘二平方

这里写图片描述

这里写代码片
#include<iostream>
#include<queue> //队列 

using namespace std;

queue <int> arr;    //定义一个队列(队列元素为整型) 
int m, n;
int used[10001]={0};
int step[10001];
void init();
int bfs();
int moveto(int u,int dire);

int main()
{
    int num;
    cin >> m >> n;
    init();
    num=bfs();
    cout<<num<<endl;
    return (0);
} 

void init()
{
    arr.push(m);    //把起点加入队列 
    used[m]=1;  //标注起点是已到达过的节点 
    step[m]=0;  //记录起点是零步到达的节点 
}

int bfs()
{
    int u, v, i;
    while(!arr.empty()) //队列不空时继续 
    {
        u=arr.front (); //队首元素给u 
        arr.pop();  //队首元素出队 
        for(i=0;i<3;i++)    //0-加一;1-乘二;3-平方
        {
            v=moveto(u,i);  //v=u达到的第i个新状态
            if(v==n)
                return(step[u]+1);  //返回最小步数 
            if(v<=n&&used[v]==0)     //如果v有进一步拓展的价值
                {   
                    arr.push(v);    //v入队 
                    used[v]=1;
                    step[v]=step[u]+1;  //记录到达v的最小步数 
                } 
        } 
    }
    return (-1);
}

int moveto(int u,int dire)
{
    if(dire==0)
        return (u+1);
    else if(dire==1)
        return (u+u);
    else if(dire==2)
        return (u*u);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值