我不知道如何简洁地描述这个目标,这可能是为什么尽管进行了大量的搜索,但我仍然无法找到适用的算法,但一张图片可以清晰地展示它:
给定左侧网格中的项目状态,有人知道一种有效的算法来查找右侧网格中显示的结束位置吗?在这种情况下,所有项目都已“下降”,但是方向当然是任意的。重点是:- 有一组由相邻正方形组成的任意形状的项目 - 项目不能重叠 - 所有项目应该沿着给定方向移动最大距离,直到它们接触墙壁,或者它们接触另一个项目,该项目[...无限制地接触另一个项目...]接触墙壁。
这不是作业,我不是学生。这是我对几何和编程的兴趣。我没有提及语言,因为它并不重要。我可以在我正在工作的特定项目所使用的语言中实现任何算法。有用的答案可以用文字或代码描述;思想很重要。
这个问题可能可以抽象成某种依赖关系和松弛空间的图(在数学意义上),因此可能可以采用旨在最小化滞后时间的算法。
如果您不知道答案,但即将试图即兴制定算法,请记住可能存在循环依赖关系,例如交错的粉色(向后)“C”和蓝色“T”形状。 T的一部分在C下方,C的一部分在T下方。如果交错的物品通过几个零件的“循环”锁定,这将更加棘手。
适用算法的一些说明:由于我构建了网格对象管理框架,以下所有内容都非常容易快速完成:
- 枚举每个零件内的单个正方形 - 枚举所有零件 - 查找在整个网格中占据特定正方形的零件(如果有)
答案的一个提示是:maniek首先提到了它,但bloops提供了一个绝妙的解释。我认为绝对关键是洞察到所有移动相同量的零件保持彼此的关系,因此那些关系不必考虑。
对于稀疏填充的板的另一个加速方法是移动所有零件以消除完全为空的行。很容易计算空行并识别位于空行上方的一侧(“以上”)的零件。
最后说明:我确实实现了bloops所描述的算法,并进行了一些特定于实现的修改。它的工作效果非常好。