当青训营遇上码上掘
本题是一个经典的最短路径问题,要求在一条数轴上求出从起点到终点的最短距离。该问题可以用广度优先搜索(BFS)算法来解决,BFS 算法是基于图的遍历算法,用于求解从起点到终点的最短路径,算法时间复杂度为 O(E+V),其中 E 表示边的数目,V 表示点的数目。
问题分析:
首先,本题的实际问题是给定一个一维数轴,小青和小码分别位于该数轴上的不同位置,小青有两种移动方式:步行和公交,步行可以向左或向右移动一格,公交可以将当前位置乘以二,求小青到小码的最短距离。该问题可以抽象成一个图,数轴上的每个点可以看作图中的一个节点,两个节点之间的连线表示两个位置之间的移动方式,即步行或公交。本题要求的最短距离可以看作是从起点到终点的最短路径长度。
解决思路:
针对该问题,我们可以使用 BFS 算法来解决。BFS 算法的基本思路是:从起点开始,将其加入队列,然后逐个取出队列中的元素,将与该元素相邻的未访问过的节点加入队列中,直到找到终点或队列为空为止。
在本题中,我们可以定义一个结构体 Node,表示数轴上的一个节点,其中 pos 表示该节点的位置,step 表示从起点到该节点所需的步数。在 BFS 算法的实现中,我们首先需要定义一个队列,然后将起点加入队列中,并标记起点已经访问过。接下来,我们依次取出队列中的元素,如果该元素的位置为终点,则返回该节点的步数。否则,我们将该节点的相邻节点加入队列中,这些相邻节点分别是当前节点左右两侧的位置以及当前位置的两倍,需要判断这些相邻节点是否越界或已经访问过,如果没有越界或未访问过,就将其加入队列中,标记为已访问过。
在实现过程中,需要注意队列的初始化,防止越界以及重复访问。当队列为空时,说明无法从起点到终点,返回-1。
最后,在主函数中,读入小青和小码的位置,并输出从小青到小码的最短距离。
总结
在实际应用中,最短路径问题是一类非常重要的问题,在实际应用中,往往需要考虑多种因素,如路程时间、路费、交通状况、道路状况等因素,因此最短路径问题是一个非常复杂的问题。在这些应用中,往往需要根据实际情况选择不同的算法来解决,例如 Dijkstra 算法、A* 算法、Bellman-Ford 算法等。
附变量详细说明:
start:表示小青的起点,即地点 N。
target:表示小码的终点,即地点 K。
vis:表示该节点是否被访问过的标记数组,vis[i] = 0 表示节点 i 没有被访问过,vis[i] = 1 表示节点 i 已经被访问过。
step:表示小青到达某一节点所需的时间(步数)。
q:表示 BFS 队列,存储待处理的节点。
ans:表示最终的结果,即小青到达小码家所需的最短时间。
cur:表示当前节点的位置。
x:表示从当前节点向左或右移动一步后的位置。
y:表示从当前节点乘以 2 后的位置。
除此之外,还有一些临时变量,用于辅助实现 BFS 算法。这些变量包括:
cnt:表示当前 BFS 层数的节点数。
next:表示 BFS 层数的下一个节点数。
i:表示循环计数器,用于遍历数组等操作。
flag:表示当前节点是否可达的标记,flag = 0 表示当前节点不可达,flag = 1 表示当前节点可达。
代码: