在阵列中排序不同大小的卡

时间:2018-03-22 01:37:41

标签: c++ arrays struct

我一直试图解决这个问题很长一段时间但我似乎陷入了困境而没有得到所需的结果。

让我们说我想把一些牌叠在手里。 我必须使用一组结构,因为每张卡都有一个名字。

struct Creature {
std::string name;
int x, y;
};

在我的main.cpp中,我创建了变量

Creature c[MAX_CARDS]

我只能容纳100张卡,因此MAX_CARDS为100。 问题是,只有10张独特的卡片。每个都有自己的名字和自己的大小。尺寸如2x6,3x1,4x2,1x10,8x4,1x5,6x2等......

规则是没有卡比它下面的卡大。以最小的方式排序'最大的。例如,如果card1是4x8而card2是2x9,那么这些卡是不可堆叠的,因此它们将被分拣到阵列的末尾,因为下一张卡可能是一张卡,可以满足其中一张卡和然后将其拖拽到阵列中的正确位置,与x和y相同大小的卡相同,因此重复到后面。但是,如果card1是1x2而card2是1x3,这可以工作并且可以堆叠。

我希望能解释堆叠卡的逻辑,因为这是我认为我遇到麻烦的部分。

template <typename T>
void sortArray(T c[], const int size) {
  int positionOfMin, x1, x2, y1, y2;
  T minValue, temp;
  bool swap = false;
  for (int i = 0; i < size; i++) {
    minValue = c[i];
    positionOfMin = i;

    for (int j = i+1; j < size; j++) {
      x1 = minValue.x;
      y1 = minValue.y;
      x2 = c[j].x;
      y2 = c[j].y;

      if(x1 < x2 && y1 < y2) {
        swap = false;   
      }else if (((x1 > x2 && x1 > y2) || (y2 > x2 && y1 > y2))  )  {
        swap = true;
      }else if (x1 == x2 && y1 == y2){
        swap = false;
      }else{
        swap = true;
      }
      if (swap == true) {
         minValue = c[j];
         positionOfMin = j;
      }

    }

// Swap the values to the new or same minimum value
  temp = c[i];
  c[i] = minValue;
  c[positionOfMin] = temp;
  }
}

任何想法或帮助将不胜感激,我得到的结果根本不正确。

1 个答案:

答案 0 :(得分:0)

按(减少){x,y}排序,一旦遇到不可堆叠的卡,它们会创建不同的堆栈。

std::vector<std::vector<Card>> reorganize(std::vector<Card> cards)
{
    std::sort(cards.begin(), cards.end(),
              [](const Card& lhs, const Card& rhs){
                  return std::tie(rhs.width, rhs.height) < std::tie(lhs.width, lhs.height);
              });

    std::vector<std::vector<Card>> res;

    for (const auto& card : cards) {
        auto it = std::find_if(res.begin(), res.end(),
                               [&](const auto& stack) {
                                    return card.height <= stack.back().height;
                               });

        if (it == res.end()) {
            res.push_back({card});
        } else {
            (*it).push_back(card);
        }
    }
    return res;
}

Demo