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

我找不到解决问题的算法了.

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

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

谢谢!

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

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

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

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

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

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

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

点赞