【问题标题】:C++ - Shuffle a queue with recursion [closed]C ++ - 使用递归随机排列队列[关闭]
【发布时间】:2015-12-19 14:24:03
【问题描述】:

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

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

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

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

非常感谢。

【问题讨论】:

  • 你的问题是什么?递归,洗牌?
  • 我不知道如何对链表或数组或队列中的某些对象进行洗牌,这是作业要求的。

标签: c++ recursion queue


【解决方案1】:

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

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

【讨论】:

  • 使用std::swap而不是手动交换。
  • 请注意,rand&lt;random&gt; 中还有更好的选择
  • @Jarod42 在处理学生和作业时,我尝试使用最低或 基本 功能,因为您无法分辨它们在课程中的位置。否则我会简单地使用std::shuffle(...)。我只想提示递归的想法。 :)
  • 使用子方法也让事情变得更简单:const int rnd_index = random_value_in(pos, deck.size()); swap(deck[pos], deck[rnd_index]); shuffle(deck, pos + 1);
  • 这是一个了不起的解决方案,非常感谢你们!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多