首页 > 代码库 > PAT 1042 Shuffling Machine
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", ×); 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来代替元素拷贝。
PAT 1042 Shuffling Machine
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。