我正在寻找解决以下问题的指针:我有一组矩形,其高度已知,x位也是,我想以更紧凑的形式打包它们。使用一个小图画(所有矩形宽度相同,但宽度可能在现实生活中有所不同),我想,而不是。
-r1-
-r2--
-r3--
-r4-
-r5--
等等。
-r1- -r3--
-r2-- -r4-
-r5--
所有提示将不胜感激。我不一定在寻找“最佳”解决方案。
答案 0 :(得分:2)
您的问题是一个更简单的变体,但您可能会得到一些关于为“binpacking”问题开发的启发式的技巧。已经有很多关于此的文章,但this page是一个良好的开端。
答案 1 :(得分:2)
答案 2 :(得分:1)
这样的东西?
编写一种方法,检查在x轴的某个间隔上存在哪些矩形
Collection<Rectangle> overlaps (int startx, int endx, Collection<Rectangle> rects){
...
}
循环遍历矩形集合
Collection<Rectangle> toDraw;
Collection<Rectangle> drawn;
foreach (Rectangle r in toDraw){
Collection<Rectangle> overlapping = overlaps (r.x, r.x+r.width, drawn);
int y = 0;
foreach(Rectangle overlapRect in overlapping){
y += overlapRect.height;
}
drawRectangle(y, Rectangle);
drawn.add(r);
}
答案 3 :(得分:1)
矩形的高度是否相同?如果它们是,并且问题只是将每个矩形放入哪一行,那么问题归结为对形式的所有矩形对(X,Y)的一系列约束“矩形X不能在同一行中矩形Y“当矩形X在x方向上与矩形Y重叠时。
用于此的“贪婪”算法从左到右对矩形进行排序,然后将每个矩形依次分配给它所适合的最低编号行。因为矩形是从左到右处理的,所以只需要担心当前矩形的左手边缘是否会与任何其他矩形重叠,这在一定程度上简化了重叠检测算法。
我无法证明这是最佳解决方案,但另一方面也无法想到任何反例。任何人吗?
答案 4 :(得分:0)
将类似俄罗斯方块的游戏放入您的网站。根据您的参数生成下降的块和游戏区域的大小。基于其设计的紧凑性(较少的自由空间=更多点)奖励玩家。让您的网站访问者为您执行工作。
答案 5 :(得分:0)
之前我曾经遇到过这样的问题。最直观的图片可能是大矩形在底部的图片,较小的图片在顶部,有点像将它们全部放在容器中并摇动它,使重的矩形落到底部。所以要做到这一点,首先按照减小面积(或宽度)的顺序对数组进行排序 - 我们将首先处理大型项目并将图片重新构建。
现在问题是如果我理解正确的话,将y坐标分配给一组给出x坐标的矩形。
迭代你的矩形数组。对于每个矩形,将矩形的y坐标初始化为0.然后通过增加此矩形的y坐标进行循环,直到它不与任何先前放置的矩形相交(您需要跟踪先前放置的矩形)。提交您刚刚找到的y坐标,然后继续处理下一个矩形。