寻路代码产生意外结果

2024-03-10

首先,请原谅这个不好的标题,但我不知道如何用一句话来描述它......

给定一个包含 3 种字段的网格:空字段、墙壁和出口,我编写了一个程序来检查每个空字段,该字段是否“安全”。 一个人穿过那个网格,但只能非对角线行走,不能穿过墙壁。这个人从一块田地开始,随机选择一个方向,然后开始朝那个方向行走。一旦撞到墙壁,它就会再次随机选择一个方向,开始移动that方向等。 如果一个人从该区域开始如上所述穿过网格,并保证在某个点找到出口,则该区域被认为是安全的。

我写了一个Python程序来解决这个问题。它为它检查的每个字段构建一棵“树”,包含来自该字段的每个可能的路线。 我有一个函数,通过递归地将当前节点的父节点添加到节点列表中,直到到达最顶层节点,仅返回给定节点的“父节点”。

当仅检查一个字段(例如 (1, 4))时,程序会按预期工作。但是,在检查示例网格的所有字段时它不起作用。

我已经研究过它并意识到返回给定节点的所有父节点的 alle_parents() 函数在检查所有节点时会产生意外的结果。例如。当检查字段 (1, 4) 时,该节点的一个子节点是 (1, 8)。 (1, 8) 的父母应该是 (1, 4)。但事实并非如此。 alle_parents((1, 8)) 返回许多不应该存在的不同字段。但是我不明白为什么它会这样。我唯一的猜测是,这与“剩余”数据/GC 未按预期工作有关。

相关代码:

class Knoten():
    def __init__(self, x, y, parent = None):
        self.x = x
        self.y = y
        self.parent = parent
        self.children = []

n = len(spielfeld)
m = len(spielfeld[0])
for k in range(n):
    for j in range(m):      
        if spielfeld[k][j] not in [None, '#', 'E']:
            baum = []
            i = 0
            ebene = []
            ebene.append(Knoten(k, j))
            baum.append(ebene)

            i += 1
            while i <= 100:
                ebene = []

                for knoten in baum[i - 1]:
                    children = []

                    if spielfeld[knoten.x][knoten.y] == 'E':
                        continue

                    for feld in next_feld(knoten.x, knoten.y):
                        knoten_neu = Knoten(feld[0], feld[1], knoten)

                        hinzufuegen = True
                        for parent in alle_parents(knoten_neu):
                            if knoten_neu.x == parent.x and knoten_neu.y == parent.y:
                                hinzufuegen = False

                        if hinzufuegen:
                            ebene.append(knoten_neu)
                            children.append(knoten_neu)

                    knoten.children = children

                    if children == []:
                        if spielfeld[knoten.x][knoten.y] != 'E':
                            spielfeld[k][j] = '%' # Field not safe

                baum.append(ebene)
                i += 1

def alle_parents(knoten, parents = []):
    if knoten.parent == None:
        return parents
    else:
        parents.append(knoten.parent)
        return alle_parents(knoten.parent, parents)

我正在使用的示例地图:

############
# #      # #
#   ##     #
#   #   E# #
#       ## #
#          #
# #E    E###
############

完整代码(部分是德语,抱歉):http://pastebin.com/3XUBbpkK http://pastebin.com/3XUBbpkK


我怀疑你的问题是一个常见的 Python 陷阱。这行:

def alle_parents(knoten, parents = []):

加载模块时创建一个空数组,而不是每次调用函数时创建一个空数组。未来对 alle_parents() 的调用将重用相同的数组(其大小可能已增加)而不是新的空数组!修复的一个好方法是执行以下操作:

def alle_parents(knoten, parents = None):
    parents = parents or []
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻路代码产生意外结果 的相关文章

随机推荐

  • 将已发送的彩信插入发送箱

    我正在尝试将彩信插入发送的数据库中 但可惜我无法在本机 Android 应用程序中查看它 我的插入代码 ContentValues values new ContentValues values put thread id thread i
  • 如何验证日历中的日期

    我已尝试使用以下代码 我已遵循示例 来测试从日历中选择的日期 如果我的数据库中不存在该日期 则应向最终用户显示验证错误消息 然而 错误并没有以
  • iOS 3 SDK 中 [NSBundle mainBundle] URLForResource:withExtension: 的替代方案是什么

    我正在使用 iOS 4 2 SDK 开发一个 iOS 应用程序 但我希望该应用程序能够在旧设备上运行 例如装有 iOS 3 1 3 的 iPhone 2G 我不知道这段代码的替代方案是什么 NSURL modelURL NSBundle m
  • 如何在 Azure 计算模拟器上配置 Web 角色以像本地 IIS(静态 URL)一样工作

    那么 问题是如何在 Azure 计算模拟器上配置 Web 角色 使其像在本地 IIS 上一样工作 我的意思是 Web 角色具有固定 url 就像您可以在项目属性中设置 使用本地 IIS Web 服务器 并设置固定 url 一样 如何将 Az
  • javascript:将参数传递给对象构造函数

    我正在编写一个jquery lib 我需要实现日期时间函数 我需要创建一个 Date 函数 它返回一个新的 Date 对象 如何将 Date args 函数的参数传递给 Date 对象构造函数以创建新的日期对象 我尝试了这样的方法 me是插
  • 导入不带 .py 扩展名的 python 模块,[重复]

    这个问题在这里已经有答案了 我同意有类似的问题 但没有一个符合我的目的 我有一个 python 脚本 没有 py 扩展名 我既不能更改文件名也不能添加符号链接 文件名很重要 我需要将上述文件导入到另一个python脚本中 我尝试过以下方法
  • ActionSheet 的工具栏问题

    我有以下示例代码 import SwiftUI struct ContentView View var body some View NavigationView NavigationLink destination DetailViewT
  • Oracle 存储过程中记录错误消息

    我们计划使用 Oracle DBMS 调度程序包将存储过程配置为每天作为批处理作业运行 我们想知道发生错误时记录错误消息的最佳方法是什么 是否可以选择记录到临时表 或者有更好的选择 提前致谢 登录临时表可能是一个很好的解决方案 例如 您可以
  • 为什么我的 MVC 项目发布后无法运行?

    我最近将我的第一个 MVC 2 项目发布到运行 Windows 2008 的商业 Web 服务器 据称该项目可以毫无问题地支持其他 MVC 站点 但遇到了一些问题 这是该项目的高级结构 正如您所看到的 这非常简单 但是 在发布站点并导航到
  • 我是 .NET 新手 - 我应该关注什么,应该忽略什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 因此 我在使用 php 和 Coldfusion 编程数据库驱动的 Web 应用程序方面拥有相当多的经验 不是在一起 在不同的时间 并且我开始研
  • 可以强制执行类型提示吗?

    在 python 中使用 类型提示 表示法有什么好处吗 import sys def parse arg line int gt str print arg line passing a string returning None if n
  • 如何重新启动 Hibernate 处理的 PostgreSQL 序列?

    我的任务是重新启动 PostgreSQL 数据库中许多不同序列列的序列 通常 我会简单地使用 ALTER SEQUENCE serial RESTART WITH 105 然而 Hibernate 似乎被用来处理数据库序列 我真的对Hibe
  • 持久化和刷新 - Doctrine 和 MongoDB

    冲洗 有多快 我使用 persist 将数千个项目添加到集合中 然后清空集合 然后刷新它 dm this gt get doctrine odm mongodb document manager while stuff item new I
  • Mockito:是否可以将mock与方法名称结合起来在when()调用中创建methodCall?

    我在 StackOverflow 上的第一个问题 我希望能够做类似的事情 SomeClass 模拟 模拟 SomeClass class String 方法名 someMethod 或 方法 方法 someMethod 这两件事 模拟和方法
  • 如何在 Android NDK 中使用 Asio(独立于 Boost)?

    Asio 没有 Boost 应该只使用标题就可以使用 对吗 默认情况下 Asio 是一个仅包含头文件的库 http think async com http think async com 我知道Asio内部仍然依赖Boost 这是我的设置
  • 模块与包 Android Studio

    我对 Android Studio 和 Java 非常陌生 我正在开发一个应用程序 该应用程序基本上遵循分层架构 具有不同的层 例如 UI 数据访问层 服务层等 我不清楚包和模块之间的区别 我的问题是 将所有这些不同的层放在模块或包中的哪里
  • 在 React 中将状态从一个组件设置为另一个组件的最佳实践方法

    我从最佳实践的角度提出这个问题 我在这里找到的答案是关于单个代码库的更具体的问题 如果已经得到答案 我很高兴能被指出正确的方向 或者如果我正在尝试的内容不被认为是良好的做法 我很高兴能以另一种方式显示 我可能误解了一些概念 我正在学习 Re
  • 可以重载花括号吗?

    我几乎可以肯定不是 但我没有找到明确的答案 是否可以重载花括号 如 class Foo int i public int operator int i return i 42 int main Foo f f 2 return 0 它从未被
  • C++ 中的矩阵数据类型

    C 中有一种数据类型叫矩阵吗 如果是 使用它时应该包含哪个头文件 The 升压矩阵库 http www boost org doc libs 1 42 0 libs numeric ublas doc matrix htm提供了这个 对于更
  • 寻路代码产生意外结果

    首先 请原谅这个不好的标题 但我不知道如何用一句话来描述它 给定一个包含 3 种字段的网格 空字段 墙壁和出口 我编写了一个程序来检查每个空字段 该字段是否 安全 一个人穿过那个网格 但只能非对角线行走 不能穿过墙壁 这个人从一块田地开始