C++ - 使用递归打乱队列

C++ - Shuffle a queue with recursion

我有一个任务要求我创建一个基本的算命应用程序。我需要做的是,先创建一副纸牌,然后洗牌,洗牌的过程必须是递归的,不能根据赋值进行循环。牌组也必须是一个队列数据结构。

我有一个卡片结构体,里面有两个char变量,一个是卡片的类型,比如D代表方块,H代表红心,另一个变量是卡片的编号,比如作为4或J或K。我为卡片创建了一个队列,称为甲板,我用一个基本循环初始化了甲板,队列的前13个元素是钻石,接下来的13个元素是梅花等等。

问题是关于洗牌的。我的套牌必须是一个队列,但是如果有一个数组的解决方案,例如,我可以使用该数组进行洗牌,然后将数组转移到队列中。但目前我不知道该怎么做,既不使用数组也不使用队列,伪代码对我来说会很棒。

我做了所有的研究,但没有关于递归改组的任何内容,现在我没有想法,我不期望程序的完整解决方案,我只需要一些关于递归改组的基本想法。

非常感谢。

递归地打乱数组,思路如下。

1) 取最前面的元素,随机选择另一个元素,交换它们。

2) 打乱 remaining 数组(没有前面的元素)。

3) 当前位置在数组末尾时递归停止

void shuffle(std::array<Card, 52>& deck, int pos = 0)
{ if (deck.size() - pos < 2) return;

  // select a random element behind the current one
  int rnd = pos + 1 + std::rand() % (deck.size() - pos - 1);

  std::swap(deck[pos], deck[rnd]);

  // recursively shuffle the remainder of the deck
  shuffle(deck, pos + 1);
}

设置并初始化卡片组后,您可以调用shuffle(deck);

p.s:这不是 "ideal" C++14 代码,因为我们可以使用高级功能,但这只是一个 提示使用递归打乱数组。