C语言中用队列和搜索解决"加1乘2平方问题"

描述
给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次
输入
输入两个10000以内的正整数m和n,且m小于n
输出
输出从m变化到n的最少次数
输入样例
1 16
输出样例
3

#include<iostream>
#include<stdio.h>
#include<queue>//用队列声明头文件 
using namespace std;

queue<int> q1;//声明队列 
int m,n;
int used[10001]={0};//记录哪个数已经搜索过 
int step[10001];//记录计算了几步 

void init();
int bfs();
int moveto(int u,int dire);

int main()
{
    int num;
    scanf("%d%d",&m,&n);
    init();//初始化函数 
    num=bfs();//搜索并赋值 
    printf("%d\n",num);
    return 0;
}
void init()
{
    q1.push(m);//把起点加入队列 
    used[m]=1;//标注起点是已到达过的结点 
    step[m]=0;  //记录起点是0步到达的结点 
} 
int bfs()
{
    int u,v,i;
    while(!q1.empty())        //当队列不空时继续 
    {
        u=q1.front();         //队首元素给U 
        q1.pop() ;            //队首元素出队 
        for(i=0;i<3;i++)      //0表示+1;1表示乘2;2表示平方 
        {
            v=moveto(u,i);     //u到达的第i个新状态
            if(v==n)          //如果v是目标 
            {
                return(step[u]+1);      //返回到达目标的最小步数 
            }
            if(v<=n&&used[v]==0)          //如果未越界并且没被用过(有进一步扩展价值);
            {
                q1.push(v);//v入队 
                used[v]=1;//标记v是已到达过的节点 
                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(2*u);
    }
    else if(dire==2)
    {
        return(u*u);
    }
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值