2016.11.3
【題目描述】
1541.加1乘2平方
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
給定兩個正整數m、n,問只能做加1、乘2和平方這三種變化,從m變化到n最少需要幾次
輸入
輸入兩個10000以內的正整數m和n,且m小於n
輸出
輸出從m變化到n的最少次數
輸入樣例
1 16
輸出樣例
3
【解題思路】
BFS,從當前節點擴展狀態加入隊列中,直到出現目標狀態
【代碼實現】
# include <iostream>
# include <queue>
using namespace std;
int m, n, num;
int used[100005];
queue<int> q;
void init(void);
int bfs(void);
int moveto(int ,int );
int main(void)
{
cin >> m >> n;
init();
num = bfs();
cout << num << endl;
return 0;
}
int bfs(void)
{
int i, t, k;
while (!q.empty())
{
t = q.front();
q.pop();
for (i = 1; i <= 3; ++i)
{
k = moveto(t, i);
if (k > n)
continue;
if (k == n)
return used[t] + 1;
if (used[k] == -1)
{
used[k] = used[t] + 1;
q.push(k);
}
}
}
}
void init()
{
int i;
for (i = 1; i <= 10000; ++i)
used[i] = -1;
q.push(m);
used[m] = 0;
}
int moveto(int a, int b)
{
if (b == 1)
return a * a;
else if (b == 2)
return a + 1;
else
return a * 2;
}
【心得體會】
學會STL中隊列的使用