在图中找到2个给定城市之间的路径但有条件需要在K步后访问检查站城市

问题描述

我刚刚学习了 DFS、BFS 和其他一些最短路径算法,但我无法解决这个练习。

有些城市有食物供应。有些没有。我们想从“起点”走到“终点”,但条件是我们可以在食物用完之前最多走 K 步。

(* 表示城市有食物供应)

例如,对于 K = 3 的情况

我们不能从A到G,因为一路上没有食物供应,所以我们死在D市(3步没有食物)

A*----B----C----D----E----F----G*

但是如果C和F城市有食物供应,我们可以从A到G,在C和F城市取食物,然后继续到G

A* ----B----C* ----D----E----F* ----G*

有什么想法吗?

(我们可以假设 start 和 destination 总是包含食物供应)

(食物不叠加,捡到最后一个食物后3步死亡)

(不能多次访问城市)

解决方法

取一个数组,假设它为 arr[节点数][距离] 并将其全部标记为 -1,现在从 a 开始,这里的节点数表示您所在的节点,距离表示与该节点的距离最近的食物节点,现在在 a 上运行 dfs,如果你旅行一个节点,比如说 b,与最近的食物节点的距离让说 2,标记 arr[node b][2]=1(1 表示它已经被旅行了) ,现在如果你再次以相同的距离 2 到达节点 b(可能是从其他节点而不是节点 a),你会说我无法通过这条路径到达结束节点,现在如果你到达任何食物节点,我们称之为 c,使距离为0,即标记arr[c node][0]=1,现在如果您能够以这种方式到达最终节点,则成功否则您无法到达最终节点。 这是一个示例算法,

void funct(int node,int distance,int max_distance,int final_node){
    if(node==final_node):
        final_node can be reached
    if(distance>max_distance):
         return
    if(node == food_node):
        dist=0
    else:
        dist=distance
    if (arr[node][dist]==1):
        return
    for all the nearby node:
        arr[node][dist]=1
        funct(nearby node,dist+1,max_distance,final_node)
    

在你的例子中,最终节点是 G,max_distance 是 3,arr 是二维数组