C++-用递归打乱队列

C++ - Shuffle a queue with recursion

本文关键字:队列 递归 C++-      更新时间:2023-10-16

我有一个任务,要求我基本上创建一个算命应用程序。我需要做的是,首先创建一副牌,然后洗牌,洗牌过程必须是递归的,并且根据分配没有任何循环。甲板还必须是一个队列数据结构。

我有一个卡片结构,它有两个char变量,其中一个包含卡片的类型,比如D代表钻石,H代表心形,另一个变量是卡片的编号,比如4、J或K。我为卡片创建了一个队列,称为deck,我用一个基本循环初始化了deck,队列的前13个元素是diamonds,接下来的13个元素是俱乐部等等

问题在于洗牌。我的牌组必须是一个队列,但如果有一个数组的解决方案,例如,我可以使用该数组进行洗牌,然后将数组转移到队列中。但目前我不知道如何做到这一点,无论是使用数组还是队列,伪代码对我来说都是惊人的

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

非常感谢。

要递归地打乱数组,其思想如下。

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

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

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:这不是"理想的"C++14代码,因为我们可以使用高级功能,但这只是一个提示如何使用递归打乱数组。