【问题标题】:The King's Maze国王的迷宫
【发布时间】:2011-04-08 14:04:48
【问题描述】:

我正在为一场编程比赛做准备,我正在解决一些我过去无法回答的难题。其中之一是国王的迷宫。本质上,你会得到一个 NxN 数组 -50<x<50 代表“令牌”。您必须从位置 1,1(我假设数组索引中的 0,0)开始并在 N,N 处结束。您必须在访问的单元格上拾取令牌,并且您不能踩没有令牌的单元格(由 0 表示)。如果你被 0 包围,你就输了。如果迷宫没有解决方案,则输出“无解决方案”。否则,您将输出通过将您拾取的代币相加可以获得的最大可能数字。

我不知道如何解决这个问题。我想你可以写一个迷宫算法来解决它,但这需要时间,而且在编程比赛中你只有两个小时来解决多个问题。我猜我缺少某种模式。有谁知道我应该如何处理这个问题?

另外,提到这个问题是针对高中生的,这可能会有所帮助。

【问题讨论】:

  • 我们必须在谷歌上搜索“国王的迷宫”的全部内容吗?
  • 嗯,我的描述被截断了,抱歉。我把它放回去
  • 如果是编程比赛,为什么不实现算法呢?
  • 因为我还有很多其他问题要处理。但如果实现算法比我想象的要容易,那么也许吧。
  • 有一个细节让我很困惑:如果你踩到一个牢房,你会一次性捡起所有的令牌吗?还是一个?或者你可以选择你拿起多少代币?

标签: java math maze


【解决方案1】:

这类问题通常使用dynamic programmingmemoization 解决。

基本上,您制定一个递归解决方案,并在记住和重用先前计算的结果的同时自下而上地解决它。

【讨论】:

    【解决方案2】:

    简单的方法(即最简单的代码)是尝试所有可能的路径 - 尝试每个第一步;对于每个第一步,尝试每个第二步;对于每个第一步/第二步组合,尝试每个第三步;等等。然而,根据迷宫的大小,这可能需要很长时间才能运行(或者可能不会)。

    下一步是考虑如何更快地做到这一点。第一步通常是消除你知道不会导致结束的动作,或者不能导致比你已经拥有的分数更高的结束。由于这是比赛练习,我们将让您自己完成这项工作。

    【讨论】:

      【解决方案3】:

      思考“图”算法:The Algorithm Design Manual

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2020-06-14
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        相关资源
        最近更新 更多