【问题标题】:Maze solving with constraints [closed]带约束的迷宫求解[关闭]
【发布时间】:2012-11-04 10:59:18
【问题描述】:

我知道解决迷宫是 Stack Overflow 上经常讨论的话题。这是一个大家可能感兴趣的问题。

将给出一个 n*n 矩阵形式的迷宫作为输入。每个元素将位于 0-9 之间。还会给出一系列数字,每个数字都在 0-9 之间。矩阵和序列数组的维数也是已知的。问题是在矩阵中找到满足给定序列的从 (0,0) 到 (n-1,n-1) 的所有可能路径。路径只能向下、向右或向下+向右移动。必须使用线程来完成。

输入和输出格式在下面给出的示例中说明-

示例: Example1 http://gowthams.in/etc/1.PNG Example2 http://gowthams.in/etc/2.PNG Example3 http://gowthams.in/etc/3.PNG

每个线程可以打印其位置 (i,j) 或更新某种数据结构以供稍后处理。

解决这个问题的最佳方法是什么?

这是一个家庭作业问题,我可以寻求帮助。我不是在寻找任何类型的代码。我只是想要一些正确的方向。

谢谢!

【问题讨论】:

  • @MitchWheat 我对等待线程返回的处理感到震惊。我对进程做了类似的问题,我只是使用 wait(NULL) 来确保在程序继续之前所有进程都返回。线程本质上是并行处理,所以我不知道该怎么做。我确信一旦清楚地了解如何执行此代码,我就可以自己实现代码。
  • 那么这是算法问题还是线程问题?如果是后者,发布您将在单个线程中使用的算法可能会有所帮助。此外,您的所有 3 个示例看起来都一样。
  • 您的基本算法看起来不错,但它会在大型问题实例上创建大量线程。将子问题添加到队列(使用适当的锁定)并使用固定数量的线程而不是每次都启动一个新线程可能会更好。路径是否允许向上或向左?如果是这样,您需要 (a) 为每个子问题创建 8 个子问题而不是 3 个,并且 (b) 跟踪当前子问题已经访问过哪些单元格,以避免无限循环。
  • @Gowtham 给出你的确切赋值语句。我认为您误解它的可能性很小。
  • @Gowtham:但它可以从底部的2 移动到第二个4,从第二个4 移动到6。或者可能意图是您只能向右、向下或向下+向右移动?因为问题陈述没有说这样的话。

标签: c multithreading algorithm maze


【解决方案1】:

感谢您的准确陈述。

1) 这句话似乎很令人不安:

您应该为矩阵中的每个条目创建线程以 确保并行扫描。

因为这意味着对于矩阵 NxN,您肯定需要创建 N2 个线程,这对我来说太多了。

但是您的解决方案更加危险:您想开始检查路线并为每次检查创建一个新线程。这将创建解决任务所需的 指数 数量的新线程。您肯定需要某种优化:这称为动态优化:您在共享内存中存储单元格(i,j) 是否可用于完成从idxth 索引到目标单元格的序列。这样您就不必多次解决同一个子任务。我建议您为每个此类任务 [i,j,idx] 创建条件锁,并使用它来在子线程完成时告诉依赖它的线程。

2) 多条路径对你来说不是问题:如果我正确阅读了作业,你只是对这样的路径是否存在感兴趣,而不是找到所有解决方案。

我没有按照要求给出确切的解决方案,只是给出了指示。这也是我倾向于帮助家庭工作者的方式。

【讨论】:

  • 问题的语言有点模棱两可。尽管它说必须为每个元素创建一个线程,但实际上不需要这样做。以我的方式,我将为每个元素创建三个线程,在检查路径时立即返回。因此,正如您所说,可能会创建指数线程。但实际上,在实践中创建的很少,因为最多只有 2 或 3 条路径。另外,我觉得我最大的问题是多条路径。在第二个示例中,您可以看到输出格式。我不知道如何处理。感谢您的帮助!
  • @Gowtham:最坏的情况是肯定的:一切都是 1,例如那么解决方案的数量将是 2^n。标准算法将通过动态优化回溯。然而,如果任务是打印所有路径,即使这些标准算法也无法应对。如果只是计算它们,对于相对较大的表,这可以很容易地实现,完全使用我上面描述的方法。
  • @Gowtham:那么就假设不会给你最坏的情况测试用例并尽可能多地解决。您永远无法以比输出更复杂的方式改进您的算法。
  • @Gowtham:我希望您在第一次将“确切的问题陈述”添加到您的帖子时没有省略那句话,因为这样做只会混淆!无论如何,您可以通过记录 多少 种方式从状态 [i, j, idx] 而不是 是否 您可以从那里完成解决方案来调整 Boris 的 DP 方法。如果您需要其他提示,请告诉我...
  • 天哪,这很难@j_random_hacker:这只会打印数字,而不是路径本身,即不会完全解决问题。 @ Gowtham:BFS 也广泛基于 DP,但是只要您不分层检查矩阵,这不是 BFS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2013-04-16
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多