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 ;
}