华为 · 广度优先搜索(BFS) · 算法编程题
华为 广度优先搜索(BFS) n ≤ 200000 时限 1 秒 / 256 MB

题目描述

在一个平行世界的太阳系中,所有行星恰好构成一个长度为 n 的环,按顺时针依次编号为 1,2,... ,n 。相邻两颗行星间距离相等,且保证 n 为偶数。
你位于编号为 a 的行星,目标是到达编号为 b 的行星。你可以执行以下三种操作,每次操作均消耗 1 个单位时间:
顺时针移动 x 颗行星;
逆时针移动 y 颗行星;
发动一次传送技能(最多可使用 k 次),将你顺时针移动 (n/2) 颗行星,即跳到正对面的那颗行星。
请你计算,从 a 行星移动到 b 行星的最少时间;若无论如何都无法到达,则输出 -1 。

输入输出

输入描述
在一行上输入 6 个整数 n,k,a,b,x,y ,含义分别为:
n(2 ≤ n ≤ 2× 10^5) ——行星数量,且 n 为偶数;
k(0 ≤ k ≤ 2× 10^5) ——技能可使用的最大次数;
a,b(1 ≤ a,b ≤ n) ——起点与终点的编号;
x,y(1 ≤ x,y ≤ n) ——每次普通移动的距离。
输出描述
输出一个整数,表示最少所需时间;若无法到达,则输出 -1 。

样例共 3 组

样例 1 · 你可以先顺时针移动 x=2 颗行星到达编号 3 ,再逆时针移动 y=1 颗行星到达编号 2 ,共耗时 2 。
输入
4 0 1 2 2 1
输出
2
样例 2
输入
4 114514 1 3 1 1
输出
1
样例 3
输入
4 114514 1 2 2 2
输出
-1

算法解析依据充分

考点:广度优先搜索(BFS)

数据规模 n ≤ 200000 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 200000,k ≤ 200000
  • 复杂度门槛:只允许 O(n) 或 O(n log n),且常数要小(注意读入效率)。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:广度优先搜索(BFS)

按层扩散搜索,无权图上第一次到达即最短路。

思路框架(广度优先搜索(BFS) 通法 · 非本题专属)

  1. 起点入队并标记已访问。
  2. 每次取队首,把它的所有未访问邻居入队并记录步数。
  3. 第一次访问到目标时,步数即为最少步数。
  4. 网格类题目通常有 4(或 8)个方向,用方向数组统一处理。

实现要点:标记访问必须在入队时做,不能在出队时做,否则会重复入队甚至超时。

复杂度:时间 O(V+E) | 空间 O(V)

该范式的通法易错点

  • 出队才标记访问导致 MLE/TLE。
  • 网格边界没判,越界访问。
  • 多源 BFS 时只把第一个起点入队。

对照本题

  • 数据规模 n ≤ 200000,只允许 O(n) 或 O(n log n),且常数要小(注意读入效率)。

样例解读

样例 1:输入 4 0 1 2 2 1 → 输出 2

你可以先顺时针移动 x=2 颗行星到达编号 3 ,再逆时针移动 y=1 颗行星到达编号 2 ,共耗时 2 。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:华为机试编程模拟题10。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解