计蒜客 一维坐标的移动 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; }
又是一道广度搜索的题目呢...