题意:FJ有与牛在同一坐标轴上,告之FJ与牛的坐标
FJ有三种移动方式, + 1,- 1,* 2,求抓住牛的最短步数(牛不会动)
裸的bfs水题,将三种移动方式依次放入队列即可
代码如下:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e5;
int n, k, vis[N + 10];
struct node
{
int x, st;
};
int check(int x)
{
if(x < 0 || x > N || vis[x]) return 0;
return 1;
}
int bfs(int u)
{
node s, nex;
s.x = u, s.st = 0;
vis[u] = 1;
queue<node>q;
q.push(s);
while(!q.empty())
{
node a = q.front();
q.pop();
if(a.x == k) return a.st;
nex.x = a.x + 1;
if(check(nex.x))
{
nex.st = a.st + 1;
vis[nex.x] = 1;
q.push(nex);
}
nex.x = a.x - 1;
if(check(nex.x))
{
nex.st = a.st + 1;
vis[nex.x] = 1;
q.push(nex);
}
nex.x = a.x * 2;
if(check(nex.x))
{
nex.st = a.st + 1;
vis[nex.x] = 1;
q.push(nex);
}
}
return -1;
}
int main()
{
while(~scanf("%d%d", &n, &k))
{
memset(vis, 0, sizeof(vis));
int ans = bfs(n);
printf("%d\n", ans);
}
return 0;
}