如何正确有效地执行基于大小项目网格的排序?

时间:2015-04-14 11:49:19

标签: c++ sorting inventory

所以我有一个像这样的2D网格......

// Y: Size 13 For Each Column
// X: Size 9 For Each Row
vector<vector<int>> grid;

将空项目初始化为13个高度,9个宽度的网格。

想象一下,我们在网格中填充了以下项目......

  1. 3宽度5高度项目在X = 0,Y = 0。
  2. 2宽度5高度项目在X = 3,Y = 0。
  3. 2宽度5高度项目在X = 5,Y = 0。
  4. 2宽度5高度项目在X = 7,Y = 0。
  5. 2宽度5高度项目在X = 0,Y = 5。
  6. 2宽度5高度项目在X = 2,Y = 5。
  7. 2宽度5高度项目在X = 4,Y = 5。
  8. 3宽度5高度项目在X = 6,Y = 5。
  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项目之一,这会导致一些意外行为......

1 个答案:

答案 0 :(得分:2)

您可以将此视为装箱问题。这个问题是NP-complete,因此没有已知的有效方法来首先找到解决方案。解决这个问题的一种方法是从左上角的最大部分开始(0,0)。然后用剩下的2件做同样的事情。 Code inComplete中有一个很好的example这个过程。它涉及打包CSS精灵,但应该很容易在C ++中为这个解决方案进行修改。