将2D阵列放置到更大的2D阵列上,确保整齐放置

问题描述 投票:0回答:0

几周来我一直在努力解决这个问题,但一直未能想出一个合理的解决方案。

整体问题

给定一个二维数组(比如

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,并且在我的应用程序运行时可能每隔几秒只运行一次。

谢谢你的包容

arrays algorithm multidimensional-array
© www.soinside.com 2019 - 2024. All rights reserved.