我得到一个逻辑谜语,我需要一个有效的算法来解决它。
我有一个大小为w * h(宽*高)的大矩形(方框)。
我还有x个其他尺寸不大但比例固定的矩形。
获取x的最快方法是让每个X矩形的最大尺寸都在框内(大矩形)?
示例:
框矩形尺寸为150 * 50(宽*高),我有25个小矩形。
小矩形的固定比例为3(如果高度= 5则宽度= 5 * 3 = 15)。 让我们调用矩形x的高度。
我想找到最大的X,它允许我将所有矩形插入大矩形(插入框中)。
(小矩形将按行和列放置,例如按比例和最大高度排列5列和5行)
有谁知道一个有效的算法来解决这个问题?
答案 0 :(得分:0)
不仅仅是(w * h)/ 75?
是的,不需要括号......但不是你想要的吗?或者我在这里错过了一些东西?
其中w和h是大矩形或父矩形的尺寸。 75是3 * 25。
答案 1 :(得分:0)
我会尝试凭经验解决这个问题(使用backtracking解决)而不是解析,即找到所有可能性*(我将解释*)。基本上我们希望将每个矩形开始,直到矩形可以达到其最大尺寸(最大尺寸可以由最大的矩形定义,可以在碰到其邻居的起点或增长到容器主矩形之前)。这意味着如果我们尝试将每个矩形放在其可能的大小中,那么这些解决方案中的一个将是最佳解决方案。还要注意,这实际上是一个一维问题,因为rects的高度和宽度受比率约束;设置一个隐式设置另一个。
* - 当我说出所有可能性时,我的确意味着最合理的可能性。由于我们处于浮点空间,我们无法测试所有可能性。我们可以测试更精细和更精确,但无法测试所有尺寸。因此,我们定义一个步长来迭代我们将尝试的rects的大小。
const float STEP_SIZE = 0.0001;
float fLastTotalSize = 0;
int main()
{
PlaceRect(myRects.begin(), myRects.end());
}
void PlaceRect(Iterator currentRect, Iterator end)
{
if (currentRect == end)
{
return;
}
float fRectMaxSize = CalculateMaxPossibleRectSize(*currentRect);
// find the number of steps it will take to iterate from the smallest
// rect size to the largest
int nSteps = fRectMaxSize / STEP_SIZE;
for(int i = 0; i < nSteps; ++i)
{
// based on the step index scale the rect size
float fCurrentRectTestSize = i*STEP_SIZE;
currentRect->SetSize(fCurrentRectTestSize);
float fTotalSize = CalculateTotalSizesOfAllRects();
if (fTotalSize > fLastTotalSize)
{
fLastTotalSize = fTotalSize;
SaveRectConfiguration();
}
// Continue placing the rest of the rects assuming the size
// we just set for the current rect
PlaceRect(currentRect + 1, end);
// Once we return we can now reset the current rect size to
// something else and continue testing possibilities
}
}
根据步长和矩形数量,这可能会持续很长时间,但会找到经验解决方案。