在一个长度为n的坐标轴上,蒜头君想从A ;点移动到B点。他的移动规则如下:
1.向前一步,坐标增加1。
2.向后一步,坐标减少1。
3.跳跃一步,使得坐标乘2。
蒜头君不能移动到坐标小于0或大于n的位置。蒜头君想知道从A点移动到B点的最少步数是多少,你能帮他计算出来么?
输入格式
第一行输入三个整数n,A, B,分别代表坐标轴长度,起始点坐标,终点坐标。(0 <A,B < n< 5000)
输出格式
输出一个整数占-行,代表蒜头要走的最少步数。
#include <iostream>
#include <queue>
using namespace std;
queue<pair<int, int> > q;
bool vis[5005];
int main()
{
int n, A, B;
int now, step;
cin >> n >> A >> B;
q.push(make_pair(A, 0));
vis[A] = true;
while (!q.empty())
{
now = q.front().first;
step = q.front().second;
q.pop();
if (now == B)
{
cout << step << endl;
break;
}
if (now + 1 <= n && !vis[now + 1])
{
q.push(make_pair(now + 1, step + 1));
vis[now + 1] = true;
}
if (now - 1 >= 0 && !vis[now - 1])
{
q.push(make_pair(now - 1, step + 1));
vis[now - 1] = true;
}
if (now * 2 <= n && !vis[now * 2])
{
q.push(make_pair(now * 2, step + 1));
vis[now * 2] = true;
}
}
return 0;
}