NWPU演算法考試複習--加一乘二平方
阿新 • • 發佈:2018-12-21
加一乘二平方
描述 最簡單的佇列的使用 #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;
queue<int>q;
int bfs();
int a,b,step[10000];//step陣列記錄步數,表示到達那個數字的步數
int moveto(int key,int dir);
int main()
{
cin>>a>>b;
cout<<bfs()<<endl;
return 0;
}
int bfs()//廣度優先搜尋函式
{
step[a]=0;//第一步不需要變化
q.push(a);//入隊
while(!q.empty())//當佇列非空的時候,進入迴圈
{
int u=q.front();
q.pop();
for(int i=0;i<3;i++)
{
int v=moveto(u,i);//根據題意一共有三種狀態可以移動
if(v==b) return step[u]+1;
if(v<b&& step[v]==0)
{
step[v]=step[u]+1;
q.push(v);//入隊
}
}
}
return 0;
}
int moveto(int key,int dir)
{
switch(dir)
{
case 0:
key++;//+1
return key;
case 1:
key=key*2;//*2
return key;
case 2:
key=key*key;//平方
return key;
}
return -1;
}