几周来我一直在努力解决这个问题,但一直未能想出一个合理的解决方案。
给定一个二维数组(比如
grid
)和一个(希望更小的)二维数组数组(比如groups
),我需要以大致保留顺序的方式在group
内安排每个grid
(如果A
在B
中的groups
旁边,放在grid
上时它们应该彼此靠近)。
例如,将以下组放在 3x3 网格上
A A
B
B
C
会导致
A A -
B C -
B - -
我还需要能够指定它们的放置方向。
上面的例子演示了从左到右,从上到下的放置。从下到上、从左到右放置相同的项目将导致以下放置:
B - -
B C -
A A -
除此之外,可能存在给定的组无法放入
group
的情况。在这些情况下,我们必须截断或包装该项目。在算法运行之前指定要做什么,但它应该处理这两种情况。
例如,如果我们想将
A A A A
放在 3x2 网格上并截断任何不适合的部分,结果将是
A A A
- - -
截断的方向也是在运行算法之前指定的:比如放置时从左上角截断
A1 A2 A3
A4 A5 A6
A7 A8 A9
到 2x2 网格将导致
A5 A6
A8 A9
不应发生截断,除非不可能将整个组放入
grid
.
例如,如果将
A A
和 B B
放在 3x2 网格上,我们会得到
A A -
B B -
而不是
A A B
- - -
如果我们想包裹更大的组而不是截断它们,这些组应该在他们自己的行上,这样我们就不会毫无理由地分开一个组。
例如,而不是
A A B B
B B B -
- - - -
我们更喜欢
A A - -
B B B B
B - - -
当然,就像截断一样,除非绝对必要,否则我们不应该包装一个组。
例如,而不是
A A B B
B B - -
我们更喜欢
A A - -
B B B B
以上两个环绕的例子都是从左到右,从上到下的方向。
grid
时(例如“从左到右,从上到下”),太高的组应该被截断 - 只包裹宽度。grid
(例如“从上到下,从左到右”)时,太宽的组应该被截断——只包裹高度。被包裹的一组应该沿着主方向切片,第二个切片放在次要方向的下一个位置。
例如,如果方向是从上到下,从右到左,尝试放置
A1
A2
A3
在 2x2 网格上会给出
- A1
A3 A2
如果一组较大,则应在保持次要方向完整性的同时将其包裹起来。
例如放置
A1 A2 A3 A4
A5 A6 A7 A8
放到 3x4 网格上会产生
A1 A2 A3
A5 A6 A7
A4 - -
A8 - -
你可能已经猜到了,这个问题非常复杂。因此,我不一定期待一个完整的解决方案。相反,我正在寻找的是我可以解决的一系列较小的问题,这些问题可以结合起来为整个问题创建一个完整的解决方案。
我不需要我的整体解决方案具有惊人的性能,因为
grid
不太可能大于 10x10,并且在我的应用程序运行时可能每隔几秒只运行一次。
谢谢你的包容