当前位置: 首页 > 知识库问答 >
问题:

带移动约束的网格探索算法

百里沛
2023-03-14

最近,我一直被困在“探索网格”的算法上。我想根据网格上可能位于任何位置的起始正方形绘制网格中特定部分内所有有效的移动。我最初的计划是在4个方向上使用递归分割来标记网格,直到它达到边界或移动限制。探索“分支”不能沿对角线移动:

*注意:箭头不代表堆栈中的发生,它们用于可视化算法的概念

private void Explore(byte moves, byte row, char col) {
        if (row >= Grid[0].Count || col >= Grid.Count || row + col + 2 > moves) {//var < 0 handled b/c byte b = 0; (byte)(b-1) == 255
            return;
        }
        Grid[row][col].color = ...;//mark it

        if (Grid[row + 1][col + 1] == notVisited) Explore((byte) (moves - 1), (byte)(row + 1), (char) (col + 1));
        if (Grid[row - 1][col + 1]== notVisited) Explore((byte)(moves - 1), (byte)(row - 1), (char) (col + 1));
        if (Grid[row - 1][col - 1] == notVisited) Explore((byte)(moves - 1), (byte)(row - 1), (char) (col - 1));
        if (Grid[row + 1][col - 1] == notVisited) Explore((byte)(moves - 1), (byte)(row + 1), (char) (col - 1));
    }

我知道这种算法在b/c模式下不起作用。我在这里做了一个快速的可运行示例,算法在值之间卡住,直到触发运行时错误。

所以在这一点上:

> < li>

递归仍然是可能的吗(切换到迭代)?

有没有更好的替代算法来解决这个问题?

我的算法是否接近,但需要一些调整?

共有2个答案

黎腾
2023-03-14

搜索的想法应该可以正常工作,但代码不起作用的原因是它正在检查对角线。

if (Grid[row + 1][col + 1] == notVisited)
if (Grid[row - 1][col + 1]== notVisited) 
if (Grid[row - 1][col - 1] == notVisited) 
if (Grid[row + 1][col - 1] == notVisited)

我想你的意思是:

if (Grid[row + 1][col] == notVisited)
if (Grid[row - 1][col]== notVisited) 
if (Grid[row][col + 1] == notVisited) 
if (Grid[row][col - 1] == notVisited)

对于问题:

1: 递归很好。迭代会更快,但不会产生太大的影响。

2:可能有很多不同的方法,但目前的方法应该没问题。

3: 除了改变这四个条件之外

|| row + col + 2 > moves)

可能会导致程序运行异常,具体取决于其放置位置。对于所有递归路径,moves 参数都不相同,因此大多数时候程序可能会绘制整个网格。除此之外,程序应该运行正常。

易品
2023-03-14

您似乎正在寻求实现深度优先搜索。wiki文章甚至提供了一些伪代码,您可以使用它们来实现该算法。

请注意,这将标记所有可到达的方块,但除非修改算法,否则不会打印出所有(冗余)移动。

 类似资料:
  • 我的视图控制器中有几个视图,当检测到向上滑动时向上移动,然后当检测到向下滑动时向下移动。我使用CGRectOffset通过调整y原点来强制视图移动。我现在使用IB对视图施加了约束,我不确定移动视图的最佳方法是什么,以便它们最终在iPhone 5、6和6上的正确位置。 目前我正在做这样的事情: 用比值改变常数是否更好?因此,对于上面的约束,不使用338,这样做是否更好:

  • 下面是主界面,我想动态添加包含名称、作者、描述和按钮的窗格。 在这里,它很好地扩展到可用的宽度。 这是我上面UI的FXML代码 任何帮助都会得到很大的支持...

  • 我刚刚更新了使用XAMPP的本地开发环境,新版本的XAMPP使用了MariaDB,而我之前使用的旧版本使用的是MySQL,我很满意。 现在,我认为MariaDB应该与MySQL完全兼容,因为它本质上只是一个“临时”替代品,但在升级之前,我很难导入直接从MySQL导出的数据库。 我得到以下错误: 这里是: 是不是因为文件中的被创建得更靠下,它会因为认为该表不存在而出错?但是,在这么说的同时,我以前从

  • 我有一些动画,我试图转换为约束。它背后的想法是当出现错误时登录提示会反弹。 我的方法是,视图控制器上的所有内容都在bounceView中,而bounceView本身也在主视图中。 BounceView使用居中约束和前导空间约束绑定到主视图。为了使布局在设计时明确无误,还有一个前导空间和顶部空间约束。不过,这些只是占位符,在运行时被等高/宽约束替换。 没有其他约束与主视图相关联。 现在,一些细节…

  • 这将使约束在范围内,为提供额外的参数。这里我的意图是包含一些(隐藏的)具体类型,它应该用作多态函数GHC compulins的具体类型: 我的用例的假设是1。同时计算和2。隐藏类型的值涉及(至少部分)第一个元组元素的计算。这意味着我不想在中调用两次(一次是获取,一次是使用该类型绑定第一个元组元素)。在存在约束的情况下,是否有某种方法使的定义成为可能?