zoukankan      html  css  js  c++  java
  • PAT 1042 Shuffling Machine

    #include <cstdio>
    #include <cstdlib>
    #include <vector>
    
    using namespace std;
    
    char tbl[5] = {'S', 'H', 'C', 'D', 'J'};
    
    void shuffle(vector<char> &card, vector<char> &rnd) {
        int rlen= rnd.size();
        vector<char> tmp(card.size(), 0);
        for (int i=0; i<rlen; i++) {
            tmp[rnd[i]] = card[i];
        }
        card = tmp;
    }
    
    void print_card(char card) {
        printf("%c%d", tbl[card/13], card % 13 + 1);
    } 
    
    int main() {
        int times = 0, r = 0;
        vector<char> rnd(54, 0);
        vector<char> card(54, 0);
        for (int i=0; i<54; i++) {
            card[i] = i;
        }
        scanf("%d", &times);
        for (int i=0; i<54; i++) {
            scanf("%d", &r);
            rnd[i] = r - 1;
        }
        for (int i=0; i<times; i++) {
            shuffle(card, rnd);
        }
        print_card(card[0]);
        for (int i=1; i<54; i++) {
            printf(" ");
            print_card(card[i]);
        }
        return 0;
    }

    一开始想复杂了以为要像算法导论里面提到的那样进行元素交换,那里是因为随机数列不能保证在一定范围内唯一(如果要得到这样的数列其实也可以,就相当于已经进行了一次洗牌)所以遍历数组时产生的随机数是多少就把当前元素和下标和当前随机数一致的元素对换。不过这里已经说了数列是不重复的就直接把元素放到对应的位置上即可。当然程序里可以不把单次shuffle写成一个函数,这样可以避免反复创建vector,只要使用一个临时vector即可,多执行几次swap来代替元素拷贝。

  • 相关阅读:
    分治法解决寻找数组中最大最小值的问题
    bootstrap动画进度条
    关于bootstrap中css样式与自己设置的css样式相撞问题
    css引入外部字体
    清除浮动
    四叶玫瑰数
    水仙花数
    nginx 配置文件服务器
    springboot 自定义拦截器 防止恶意请求
    springboot 自定义异常
  • 原文地址:https://www.cnblogs.com/lailailai/p/4069923.html
Copyright © 2011-2022 走看看