HDU 2717
题意:给定n, k,对n进行变换,每次只能加1或者减1或者翻倍,求对n变换使之变成k所需要的最小步数。
思路:每次变换都有三种可能,把所有可能都试着走一遍,最先变成k的步数即最小步数,故BFS即可。题目没说多组数据,但是一组数据就会wa。
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <algorithm>
#include <functional>
#define debug(x) cout << "--------------> " << x << endl
using namespace std;
const double PI = acos(-1.0);
const double eps = 1e-10;
const long long INF = 0x7fffffff;
const long long MOD = 1000000007;
const int MAXN = (100000 << 1) + 27;
int dep[MAXN];
bool vis[MAXN];
int n, k;
void BFS(int x)
{
memset(dep, 0, sizeof(dep));
memset(vis, 0, sizeof(vis));
dep[x] = 0;
vis[x] = true;
queue<int> q;
q.push(x);
while(!q.empty())
{
int a = q.front();
q.pop();
if(a - 1 >= 0 && !vis[a-1])
{
dep[a-1] = dep[a] + 1;
vis[a-1] = true;
q.push(a-1);
}
if(a + 1 <= k*2 && !vis[a+1])
{
dep[a+1] = dep[a] + 1;
vis[a+1] = true;
q.push(a+1);
}
if(a * 2 <= k*2 && !vis[a*2])
{
dep[a*2] = dep[a] + 1;
vis[a*2] = true;
q.push(a*2);
}
}
return ;
}
int main()
{
while(~scanf("%d%d", &n, &k))
{
BFS(n);
printf("%d\n", dep[k]);
}
return 0;
}