zoukankan      html  css  js  c++  java
  • [CareerCup] 18.2 Shuffle Cards 洗牌

    18.2 Write a method to shuffle a deck of cards. It must be a perfect shuffle—in other words, each of the 52! permutations of the deck has to be equally likely. Assume that you are given a random number generator which is perfect.

    这道题让我们实现一个洗牌的算法,实际上洗牌的原理非常简单,就是每张牌跟一个随机位置的牌互换位置即可,那么这里就有两种实现方法,递归和迭代。我们先来看递归的方法,具体来说用的是回溯的思想,我们从i=51开始,然后每次进入递归函数,到i=0时返回,然后到了i=1,然后跟[0,i]之间的随机一张牌交换位置,然后一层一层的回来,一直回到i=51,这样每张牌我们都随机交换过位置,从而达到了洗牌的目的:

    解法一:

    void shuffle(vector<int> &cards, int i) {
        if (i == 0) return;
        shuffle(cards, i - 1);
        int k = rand() % (i + 1);
        swap(cards[k], cards[i]);
    }

    我们也可以用迭代的方法来实现,用一个for循环来将每张牌和随机位置的牌交换位置即可:

    解法二:

    void shuffle(vector<int> &cards) {
        for (int i = 0; i < cards.size(); ++i) {
            int k = rand() % (i + 1);
            swap(cards[k], cards[i]);
        }
    }

    CareerCup All in One 题目汇总

  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/grandyang/p/5453604.html
Copyright © 2011-2022 走看看