在网格中查找具有特定值的连通块

时间:2011-05-24 14:31:30

标签: algorithm collections

我无法为我的问题找到算法。

我有一个8x8块的网格,每个块的值都在0到9之间。我想找到与例如15的总值相匹配的连接块的集合。我的第一个方法是从边境,工作得很好。但是当从网格中间开始时,我的算法会丢失。

有人会知道一个简单的算法,或者你能指出我正确的方向吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

据我所知,目前还没有简单的算法。至于指向正确的方向,8x8网格实际上只是图形的一个特例,所以我从图形遍历算法开始。我发现在这种情况下,有时候会考虑如何解决较小网格(例如3x3或4x4)的问题,然后看看你的算法是否可以扩展到“全尺寸”。

编辑:
我提出的算法是修改后的深度优先遍历。要使用它,您必须将网格转换为图形。该图应该是无向的,因为连接的块在两个方向上均等地连接。

每个图节点代表一个块,包含块的值和visited变量。边缘权重表示其边缘对被遵循的阻力。通过对它们连接的节点的值求和来设置它们。根据您要查找的总和,您可以通过删除保证失败的边缘来优化此优化。例如,如果您要查找15,则可以删除权重为16或更大的所有边。

算法的其余部分将执行与块一样多次,每个块作为起始块一次。通过遵循当前节点的最低加权边来遍历图,除非它将您带到受访节点。将每个访问过的节点推送到堆栈,并将其visited变量设置为true。保持每个路径的运行总和。

  • 每当达到所需的金额时,将当前路径保存为您的答案之一。不要停止遍历,因为当前节点可以连接到零。
  • 每当总数超过所需总和时,通过将visited设置为false并将当前节点从堆栈中弹出来回溯。
  • 每当探索给定节点的所有边时,都要回溯。

在分析来自给定起始节点的每个可能路径之后,找到包括该节点的每个答案。因此,删除接触起始节点的所有边缘并选择一个新的起始节点。

我还没有完全分析这个算法的效率/运行时间,但是......它并不好。 (考虑在包含全零的图形中搜索的路径数。)也就是说,它比纯粹的暴力更好。