【算法实验三】--【分支限界法】--加1乘2平方

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;
}
 

    原文作者:分支限界法
    原文地址: https://blog.csdn.net/zhuge2017302307/article/details/86256281
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞