1541.加1乘2平方
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
最简单的队列的使用
#include <iostream>
#include <queue>
using namespace std;
queue<int> q1;
int main()
{
int temp, x;
q1.push(5);//入队
q1.push(8);//入队
temp = q1.front();//访问队首元素
q1.pop();//出队
q1.empty();//判队列是否为空
q1.back();//返回队尾元素
q1.size();//返回队列长度
}
给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次
输入
输入两个10000以内的正整数m和n,且m小于n
输出
输出从m变化到n的最少次数
输入样例
1 16
输出样例
3
解析:这是分支限界法的第一道题目,用广搜和队列来做。题目分析我在跳马的那章做了,思路是一样的。三种处理方式就相当于每个节点都有三个子节点,一一遍历就可以。
这种题一般都分为三个函数,一个初始化的init函数,在这个函数里面首先清空队列,数组used和step全赋初值为0,然后把初始值入队列,再把初值step赋为0,used赋为1。然后是bfs广搜函数,在bfs函数里面有的时候会用到move函数(例如这个题),但有的时候如果是方向就直接用dir数组,就可以不用move函数。
代码如下:
#include <iostream>
#include<queue>
using namespace std;
int m,n;
int used[10001]={0},step[10001]={0};
queue<int>q;
void init()
{
while(!q.empty())
q.pop();
q.push(m);
used[m]=1;
step[m]=0;
}
int move(int cur,int i)
{
if(i==0)
return cur+1;
if(i==1)
return 2*cur;
if(i==2)
return cur*cur;
}
int bfs()
{
while(1)
{
int cur;
cur=q.front();
q.pop();
for(int i=0;i<3;i++)
{
int mid;
mid=move(cur,i);
if(mid==n)
return step[cur]+1;
else
{
if(used[mid]==0)
{
q.push(mid);
used[mid]=1;
step[mid]=step[cur]+1;
}
}
}
}
}
int main()
{
cin>>m>>n;
init();
int num=bfs();
cout<<num<<endl;
return 0;
}