algorithm – 如何在2D数组上随机生成布局?

我有一个预定大小的2D数组和一个编号矩形列表,以适应该空间.这些矩形中的每一个都具有已知的固定高度和宽度. 2D阵列保证足够大,可以舒适地适合所有矩形.

我需要将这些矩形中的每一个随机地放入数组中,这样就不会重叠并放置所有矩形.它们可以放置在任何方向.想象一下,将您的船只放置在战舰游戏中,只需要更多不同的船型和更大的网格.

完成的数组应如下所示:(0表示空格,非零数字表示矩形编号)

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0 4 4 4 0
0 1 1 0 2 2 2 2 2 0 0 0 4 4 4 0
0 1 1 0 2 2 2 2 2 0 0 0 0 0 0 0
0 0 0 0 2 2 2 2 2 0 0 0 0 0 0 0
0 0 0 0 2 2 2 2 2 0 5 5 0 0 0 0
0 3 3 3 3 3 0 0 0 0 5 5 0 0 0 0
0 3 3 3 3 3 0 7 7 7 5 5 6 6 0 0
0 0 0 0 0 0 0 7 7 7 5 5 6 6 0 0

我考虑过的一种方法是对每个矩形,选择随机放置和方向,尝试将其放置在矩阵中.如果检测到与先前放置的块发生碰撞,请再试一次.这可能是最简单的实现,但它似乎不是非常有效,并且它不会以明确确定的方式终止(靠近列表末尾的矩形可能会与之前生成的块保持冲突很长一段时间).

是否有更好的方法来解决这个问题,以便放置后面的矩形?

最佳答案 IMO问题降级为问题 – “我们是否有足够的空间来适应下一个矩形以及如何以有效的方式找到这个地方?”

所以:

>初始条件 – 我们在“可用矩形列表”中有1个矩形可用(初始矩阵),基本上我们只需要在初始矩阵中存储自由矩形的高度和重量以及左上顶部位置
>选择随机矩形添加=“toAdd”,将其从“list添加矩形”中删除
>随机选择等于或大于“toAdd”=“available”的自由可用矩形,将其从“可用矩形列表”中删除,如果没有可用的矩形则转到步骤2
>在“可用”上选择随机位置,在其上添加“toAdd”矩形
>剪切“可用”矩形以减去“toAdd”.这里可以应用不同的切割策略,但最后您可以获得最多4个新的可用矩形
>将新的可用矩形添加到“可用矩形列表”
>转到第2步

算法不是最优的,因为在理想世界中,我们应该在步骤6中连接2个可用的邻居.

点赞