所以我有一个像这样的2D网格......
// Y: Size 13 For Each Column
// X: Size 9 For Each Row
vector<vector<int>> grid;
将空项目初始化为13个高度,9个宽度的网格。
想象一下,我们在网格中填充了以下项目......
现在想象一下,我们需要一个排序功能,将库存重新组织成最佳,最节省空间的布局。这就是我需要的......虽然我不确定如何做到这一点......
目前,我使用以下函数和函数调用...进行排序...
bool SortBySize(const InventoryItem &lhs, const InventoryItem &rhs)
{
Item itemL = GetItemByName(lhs.item);
Item itemR = GetItemByName(rhs.item);
return itemL.cells() > itemR.cells();
}
// In Main()...
sort(m_items_list.begin(), m_items_list.end(), SortBySize);
但是,这种安排会导致某些项目无法移动/排序,因为在重新订购后,该项目没有足够的空间。在这种特定情况下,首先存储2个3x5项目,然后所有2x5项目都跟随它们。但是,网格将不适合具有新排序顺序的2x5项目之一,这会导致一些意外行为......
答案 0 :(得分:2)
您可以将此视为装箱问题。这个问题是NP-complete,因此没有已知的有效方法来首先找到解决方案。解决这个问题的一种方法是从左上角的最大部分开始(0,0)。然后用剩下的2件做同样的事情。 Code inComplete中有一个很好的example这个过程。它涉及打包CSS精灵,但应该很容易在C ++中为这个解决方案进行修改。