Python 数字路径:在类似迷宫的情况下使用递归

Python 数字路径:在类似迷宫的情况下使用递归,python,recursion,path,grid,maze,Python,Recursion,Path,Grid,Maze,我正在为我的CS课程的作业而挣扎。以下是一些说明: 在本作业中,您将编写一个程序,使用称为深度优先搜索的技术,在数字网格中查找路径 作为输入,您将获得一个数字网格、一个起点、一个终点和一个目标和。您的任务是找到一条在网格中正交移动的路径,保持路径上的数字总数,并以所需的目标和结束于端点 详情: 您可以假设数字网格不大于10乘10。数字网格的示例可能如下所示: 34 58 12 10 34 3 91 10 10 41 10 76 10 7 12 10 82 10

我正在为我的CS课程的作业而挣扎。以下是一些说明:


在本作业中,您将编写一个程序,使用称为深度优先搜索的技术,在数字网格中查找路径

作为输入,您将获得一个数字网格、一个起点、一个终点和一个目标和。您的任务是找到一条在网格中正交移动的路径,保持路径上的数字总数,并以所需的目标和结束于端点

详情:

您可以假设数字网格不大于10乘10。数字网格的示例可能如下所示: 34 58 12 10 34 3 91 10 10 41 10 76 10 7 12 10 82 10 81 98 1010917

起点将由两个数字指定,行号和列号。请注意,当您计算行和列时,从零开始。因此,在下面的示例网格中,我们可以将起点指定为第2行第0列。这将表示3正下方的数字10。 类似地,将使用行号和列号指定端点。第0行第3列的端点将指向12和34之间顶行中的10。 目标和只是您希望路径和的整数值。 如果您获得了上面的网格,起点(2,0)、终点(0,3)和目标和为100,那么您可以通过在网格中遵循10来找到一条成功的路径

输入:

输入文件将包含以下内容:

第一行:7个整数 targetValue,目标和 grid_rows,网格中的行数 grid_cols,网格中的列数 起始行,起始点的行号 起始列,起始点的列号 end_行,终点的行号 end_col,端点的列号 所有后续行:输入文件中将有(网格行)其他行。每一行将由(grid_cols)整数组成,表示该行网格中的数字。 以下是三个输入文件示例,您的程序应在其中成功找到路径:

pathdata1:此文件的路径不易找到。 pathdata2:这有一个较小的矩形网格。 pathdata3:这有一个较大的网格,其中有几个死端路径。这个文件是一个很好的例子,你可以设计复杂的迷宫,并解决他们使用你的程序! 提示:

主程序应执行以下任务: 打开输入文件“pathdata.txt”。 将第一行的内容读入变量。 阅读表格。我建议将其表示为列表列表。 定义一个类“Problem”,它包含一个网格、一个路径历史记录、一个起始行和列以及一个和作为类变量。 创建类问题的实例,为其实例变量指定适当的值。 以良好的格式打印变量值和网格。这将确保您正确读取所有内容,并按照您希望的方式构建数据结构。我强烈建议您为类问题定义一个好的str方法,以便在这里使用,在程序执行时显示进度,并帮助您进行调试。 调用函数“solve”,如下所述

您还应该有一个函数“solve”,它将一个问题实例作为参数,并返回解决方案路径(如果找到),如果没有,则返回“None”。“解决”应执行以下任务: 测试以查看问题实例是否为目标状态,这意味着它当前处于结束状态,并且总和与目标总和匹配。如果是,请打印适当的消息并显示路径历史记录。 如果不是目标状态,检查总和是否超过目标总和。如果是,请打印一条消息并返回“无”。 试着向右移动,如果这样做是合法的。使用适当的起始行/列创建新的问题实例。将当前网格点设置为“无”(使其成为“已访问”)。更新总和和历史记录。打印新的问题实例,然后使用该实例作为参数递归调用“solve”。如果递归调用返回成功的路径,则返回结果。 如果向右移动不起作用,试着向上移动,然后向下移动,然后向左移动。 如果所有尝试均未成功,请返回“none”

编写一个函数“isValid”可能会对您有所帮助,它可以让您知道提议的移动是否有效。isValid将当前网格、其大小以及建议的行和列位置作为参数,如果是有效位置,则返回True;如果不是,则返回False。如果您尝试移动到栅格边界之外,或者尝试移动到当前路径已访问的位置(表示该位置的值为“无”),则该位置将无效


这就是说明。我遇到的问题是回溯。如果超过了目标和,我尝试这样做,我将路径历史、总和和位置重置为超出之前的状态,然后继续迷宫。但这只是让我进入了一个无限循环,我会返回,然后返回到超过总和的位置,然后继续回来等等,有什么建议吗


我不想作弊,所以只要你能给我指出正确的方向就行了。我很欣赏如何在我的代码中实现解决方案的技巧。

你使用了什么算法?我建议你研究基本的图遍历算法。这是一个很好的起点,在

基本思想是,您维护一个已访问节点列表(访问每个节点的最低成本)和一个要访问的“待办”节点列表(“下一步”,或超出某个已访问节点的一步)。从“待办”列表中去掉顶部节点,将其添加到已访问列表中(到达该列表的成本),并检查连接到它的每个节点。如果该节点未访问,则将其添加到“待办事项”列表中,并显示当前成本;如果该节点已访问,则检查cos