问题描述
我刚刚学习了 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 是二维数组