Algorithm 需要一个算法来计算矩形的大小吗

Algorithm 需要一个算法来计算矩形的大小吗,algorithm,graphics,graph,geometry,2d,Algorithm,Graphics,Graph,Geometry,2d,我得到一个逻辑谜语,我需要一个有效的算法来解决它 我有一个大长方形(盒子),大小为w*h(宽*高) 我还有其他x个矩形,没有大小,但比例固定 获取x的最快方法是什么,它将使每个x矩形的最大大小位于框(大矩形)内 例如: 长方体的大小是150*50(宽*高),我有25个小长方体 小矩形的固定比例为3(如果高度=5,则宽度=5*3=15)。 让我们将矩形的高度称为x 我想找到一个最大的X,它可以让我把所有的矩形插入到大矩形中 (小矩形将按行和列排列,例如按比例和最大高度排列5列和5行) 有人知道解决

我得到一个逻辑谜语,我需要一个有效的算法来解决它

我有一个大长方形(盒子),大小为w*h(宽*高)

我还有其他x个矩形,没有大小,但比例固定

获取x的最快方法是什么,它将使每个x矩形的最大大小位于框(大矩形)内

例如:

长方体的大小是150*50(宽*高),我有25个小长方体

小矩形的固定比例为3(如果高度=5,则宽度=5*3=15)。 让我们将矩形的高度称为x

我想找到一个最大的X,它可以让我把所有的矩形插入到大矩形中

(小矩形将按行和列排列,例如按比例和最大高度排列5列和5行)

有人知道解决这个问题的有效算法吗?

嗯什么

它不就是(w*h)/75吗

是的,不需要括号。。。但这不是你想要的吗?还是我的手提包在这里遗漏了什么

其中w和h是大矩形或父矩形的尺寸。
75是3*25。

我会尝试用经验而不是分析来解决这个问题,即找到所有的可能性*(我会解释*)。基本上,我们希望将每个矩形从尽可能小的矩形开始放置到其最大大小(最大大小可以由矩形在碰撞到其相邻矩形的起点或增长到容器主矩形之前的最大值定义)。这意味着,如果我们尝试将每个rect放置在其所有可能的大小中,其中一个解决方案将是最佳解决方案。还要注意,这实际上是一个一维问题,因为矩形的高度和宽度受比率的限制;设置一个隐式设置另一个

*-当我说所有可能性时,我的意思是最合理的可能性。由于我们在浮点空间中,我们无法测试所有的可能性。我们可以测试越来越精细的精度,但无法测试所有尺寸。因此,我们定义了一个步长来迭代我们将尝试的矩形的大小

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 
  }
}
const float STEP\u SIZE=0.0001;
浮动fLastTotalSize=0;
int main()
{
PlaceRect(myRects.begin(),myRects.end());
}
void PlaceRect(迭代器currentRect,迭代器end)
{
if(currentRect==end)
{
返回;
}
float-fRectMaxSize=CalculateMaxPossibleRectSize(*currentRect);
//找到从最小值开始迭代所需的步骤数
//将rect大小设置为最大
int nSteps=fRectMaxSize/步长;
对于(int i=0;iSetSize(fCurrentRectTestSize);
float-fTotalSize=CalculateTotalSizeFollRects();
如果(fTotalSize>fLastTotalSize)
{
fLastTotalSize=ftTotalSize;
SaveRectConfiguration();
}
//继续放置假定大小的其余矩形
//我们只是设置了当前的rect
PlaceRect(currentRect+1,结束);
//返回后,现在可以将当前rect大小重置为
//然后继续测试可能性
}
}

根据步长和矩形的数量,这可能会运行很长时间,但会找到经验解决方案。

我尝试取小矩形的最大值和最小值,计算所需的行数和列数,然后测量最大值作为向量。这不是一个很好的解决方案。在这个例子中,我不知道小矩形的大小。这就是我想要找到的。我只知道高度和宽度的比例。在实际情况中,我知道大矩形的大小、小矩形的数量以及高度和宽度之间的比例。