计蒜客 一维坐标的移动 bfs


问题
在一个长度为 n的坐标轴上,蒜头君想从 A 点 移动到 B 点。他的移动规则如下:

向前一步,坐标增加 1。
向后一步,坐标减少 1
跳跃一步,使得坐标乘 2
蒜头君不能移动到坐标小于 0 或大于 n 的位置。蒜头想知道从 A 点移动到 B 点的最少步数是多少,你能帮他计算出来么?

输入格式

第一行输入三个整数 n,A,B,分别代表坐标轴长度,起始点坐标,终点坐标。(0≤A,B≤n≤5000)

输出格式

输出一个整数占一行,代表蒜头要走的最少步数。

样例输入

10 2 7

样例输出

3
6

#include 
#include 
using namespace std;
queue<int> ox;
int n, a, b;
int record[5005];
int k[3] = {1, -1};
int main()
{
    cin >> n >> a >> b;
    ox.push(a);//敲入起始点
    while (!ox.empty())//遍历从0到n的所有点,找出到达每个点的最小步数
    {
        int now = ox.front();
        ox.pop();
        for (int i = 0; i < 3; i++)//对起始点做三操作
        {
            int newx;
            if (i == 2)
                newx = now * 2;
            else
                newx += k[i];
            if (newx == a || newx > n || newx < 1 || record[newx] != 0)
                continue;//重复排除,过界判断,来过排除
            record[newx] = record[now] + 1;//次数记录,到达新点的路由前一点步数加1(bfs达到了就是最小的)
            ox.push(newx);
        }
    }
    cout<//直接输出位置次数
    return 0;
}

又是一道广度搜索的题目呢...