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中队列的使用