我不知道如何解决这个问题。我得到了一个包含12个节点A-L的图表。 17个边缘连接它们。我被告知找到从A到L的所有路径。我可以多次遍历一个节点,但只能遍历一次。输出应打印每个路径和路径总数。
例如,如果只有1个路径。输出应该是:
ABCDEFGHIJKL
12
我在想一个递归深度优先搜索功能应该能够解决这个问题,但我无法找到一种方法来打印每一条路径。例如,如果我的函数找到路径ABDL并到达结束L,它将打印ABDL。然后它回到D并尝试找到另一条路径,如何在下一行再次从A打印?
任何输入都将不胜感激。谢谢!
答案 0 :(得分:0)
将信息传递给最后一个节点,因此它可以打印它在遇到死胡同时所遵循的路径,或者将后续路径传递回调用者,这样它就可以在最后打印整个路径。
递归调用子函数并向前传递数据应该是显而易见的......我敢说,直截了当;)
换句话说,让你的递归函数接受来自其子调用的遍历节点列表 - 遍历的子路径列表作为返回值。在函数结束时,如果您是子调用,则返回与函数本身访问的任何节点路径一起(附加到其他节点的开头,如果没有进一步的深度递归,则将单个节点附加到列表中)已为某些节点完成了。)
最后,当你不是一个子呼叫时,你将拥有一个完整的遍历所有路径的列表。只需将它们打印出来。
例如,假设您想要探索字母[AAA,ABA,ACA,ABC,ACC],并且某些路径无效(例如,您不允许在A之后遍历C):
def mypathsearch(path_traversed,current_letter,remaining_letters): “”搜索一串字母,一个current_letter字符和一个 包含每个字母组合的字符数组 位置 “”“
if can_traverse(path_traversed, current_letter):
for next_letter in remaining_letters[0]:
letters_after = remaining_letters[1:]
sub_paths_searched = mypathsearch(
path_traversed + current_letter, next_letter, letters_after
)
else:
# end of the line
print_path_traversed(path_traversed)