c++深搜計算加乘平方的最優解(隊列)

1541.加1乘2平方
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
最簡單的隊列的使用

include

include

using namespace std;

queue 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

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
int bfs();              //深搜每一種可能的情況
int moveto(int u,int i);//分別計算加成平方的結果
void inti();            //對隊列和元素進行初始化
queue<int>q1;
int m,n;
int used[10001]={0};    //用該數組標記數字是否在隊列中被使用過
int step[10001];        //用來記錄到達每一個數字所需要的步數
int main()
{
    int sum;
    scanf("%d%d",&m,&n);
    inti();        
    sum=bfs();
    printf("%d\n",sum);
    return 0;
}
void inti()
{
    q1.push(m);       //m進入隊列
    used[m]=1;        //標記已使用過m
    step[m]=0;        //到達m所需步數爲0
}
int bfs()
{
    int i,u,v;
    while(!q1.empty())  //當隊列不爲空時
    {
        u=q1.front();   //取出隊首元素
        q1.pop();
        for(i=0;i<3;i++)//分別計算該元素可能到達的三個結點
        {
            v=moveto(u,i);
            if(v==n)   //若計算結果爲n,結束搜索,輸出最優解
            {
                return (step[u]+1);
            }
            if(v<=n&&used[v]==0)//若此時數未越界且在隊列中沒有該元素,繼續搜索
            {
                q1.push(v);    //v入隊列
                used[v]=1;     //標記v已被使用過
                step[v]=step[u]+1;//到達v的步數等於到達u的加1
            }
        }
    }
    return (-1);
}
int moveto(int u,int i)//三種情況
{
    if(i==0)
    {
        return (u+1);
    }
    else if(i==1)
    {
        return (u+u);
    }
    else 
    {
        return (u*u);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章