您的位置:首页 > 编程语言 > C语言/C++

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

2017-11-07 10:52 543 查看
描述

给定两个正整数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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 搜索 队列
相关文章推荐