一、题目描述

Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid "inside jobs" where employees collaborate with gamblers by performing inadequate shuffles, many casinos employ automatic shuffling machines. Your task is to simulate a shuffling machine.

The machine shuffles a deck of 54 cards according to a given random order and repeats for a given number of times. It is assumed that the initial status of a card deck is in the following order:

S1, S2, ..., S13,

H1, H2, ..., H13,

C1, C2, ..., C13,

D1, D2, ..., D13,

J1, J2

where "S" stands for "Spade", "H" for "Heart", "C" for "Club", "D" for "Diamond", and "J" for "Joker". A given order is a permutation of distinct integers in [1, 54]. If the number at the i-th position is j, it means to move the card from position i to position j. For example, suppose we only have 5 cards: S3, H5, C1, D13 and J2. Given a shuffling order {4, 2, 5, 3, 1}, the result will be: J2, H5, D13, S3, C1. If we are to repeat the shuffling again, the result will be: C1, H5, S3, J2, D13.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer K (≤20) which is the number of repeat times. Then the next line contains the given order. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the shuffling results in one line. All the cards are separated by a space, and there must be no extra space at the end of the line.

Sample Input:

2

36 52 37 38 3 39 40 53 54 41 11 12 13 42 43 44 2 4 23 24 25 26 27 6 7 8 48 49 50 51 9 10 14 15 16 5 17 18 19 1 20 21 22 28 29 30 31 32 33 34 35 45 46 47

Sample Output:

S7 C11 C10 C12 S1 H7 H8 H9 D8 D9 S11 S12 S13 D10 D11 D12 S3 S4 S6 S10 H1 H2 C13 D2 D3 D4 H6 H3 D13 J1 J2 C1 C2 C3 C4 D1 S5 H5 H11 H12 C6 C7 C8 C9 S2 S8 S9 H10 D5 D6 D7 H4 H13 C5

二、题目重述

给定初试序列 S1,S2...S13, H1,H2...H13, C1,C2...C13, D1,D2...D13, J1,J2,共52个字符串,它们分别代表54张牌。显然这个算法是一个特殊的洗牌方法,为了防止有人出老千,是这样的一个背景,所以就有了本题的洗牌题。接下来对这个序列进行这个算法,比如有5张牌S3,H5,C1,D13,J2,然后输入序列{4,2,5,3,1}就会把S3放到4号位置,把H5放到2号位置,C1放到5号位置,D13放到3号位置,J2放到1号位置,于是就得到了{J2,H5,D13,S3,C1}序列,如果再进行一次这样的操作,其实就是在上面变换之后序列的基础上再进行一次这样的变化,{J2,H5,D13,S3,C1}就变成了{C1,H5,S3,J2,D13}。

三、算法思路

3.1、要存储的数据

  1. 对输入的数据进行保存:重复操作的次数n,以及54位变换序列(也就是洗牌顺序)
  2. 变换前的牌组顺序
  3. 变换后的牌组顺序

因此总结来看:

int n;
int before[54],after[54],change[54];

四、参考代码

#include <iostream>
using namespace std; int main()
{
int before[54];
//0~12 - S1,S2,...S13
//13~25 - H1,H2,...H13
//26~38 - C1,C2,...C13
//39~51 - D1,D2,...D13
//52,53 -J1,J2
//before[i]=index of array
for(int i=0;i<54;i++){
before[i]=i;
}
int after[54];
int change[54];
//n
int n;
cin>>n; for(int i=0;i<54;i++){
cin>>change[i];
change[i]--;//change-1 to after's index
}
//exchange n times
while(n--){
for(int i=0;i<54;i++){
int temp=change[i];
after[temp]=before[i];
}
for(int i=0;i<54;i++){
before[i]=after[i];
}
}
for(int i=0;i<54;i++){
if(after[i]>=0 && after[i]<=12){
//S1--S13
if(i<53){
cout<<'S'<<after[i]+1<<' ';
}
else{
cout<<'S'<<after[i]+1;
}
}
if(after[i]>=13 && after[i]<=25){
//H1--H13
if(i<53){
cout<<'H'<<after[i]-12<<' ';
}
else{
cout<<'H'<<after[i]-12;
}
}
if(after[i]>=26 && after[i]<=38){
//C1--C13
if(i<53){
cout<<'C'<<after[i]-25<<' ';
}
else{
cout<<'C'<<after[i]-25;
}
}
if(after[i]>=39 && after[i]<=51){
//D1--D13
if(i<53){
cout<<'D'<<after[i]-38<<' ';
}
else{
cout<<'D'<<after[i]-38;
}
}
if(after[i]==52){
if(i<53){
cout<<"J1 ";
}
else{
cout<<"J1";
}
}
if(after[i]==53){
if(i<53){
cout<<"J2 ";
}
else{
cout<<"J2";
}
}
}
}

在一些地方可以进行优化,

  1. 比如序列与花色的对应,可以用hash的思想进行映射,不必给每种情况一个if,因为他们是有规律的。
  2. 再比如每个数组下标从1开始存放数据,在计算对应的时候更加简便。
#include <iostream>
using namespace std;
const int N=54;
int before[N+1],after[N+1],change[N+1];
/*
1~13--S1~S13
14~26--H1~H13
27~39--C1~C13
40~52--D1~D13
53~54--J1~J2
*/
char mp[5]={'S','H','C','D','J'};
int main()
{
int n;
cin>>n;
for(int i=1;i<=N;i++){
before[i]=i;//1-55 stand for S1,S2....
}
for(int i=1;i<=N;i++){
cin>>change[i];
}
while(n--){
for(int i=1;i<=N;i++){
after[change[i]]=before[i];
}
for(int i=1;i<=N;i++){// after to before
before[i]=after[i];
}
}
//output after[N+1] from 1-54
for(int i=1;i<=N;i++){
if(i!=1)cout<<' ';
cout<<mp[(after[i]-1)/13]<<(after[i]-1)%13+1;
/*
after[i]=27,27-1=26,26/13=2,mp[2]=C,26%13+1=1,27--C1,correct
*/
}
}

1042 Shuffling Machine的更多相关文章

  1. PAT 1042. Shuffling Machine (20)

    1042. Shuffling Machine (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Shu ...

  2. PAT 1042 Shuffling Machine[难]

    1042 Shuffling Machine (20)(20 分) Shuffling is a procedure used to randomize a deck of playing cards ...

  3. 1042 Shuffling Machine (20 分)

    1042 Shuffling Machine (20 分) Shuffling is a procedure used to randomize a deck of playing cards. Be ...

  4. pat 1042 Shuffling Machine(20 分)

    1042 Shuffling Machine(20 分) Shuffling is a procedure used to randomize a deck of playing cards. Bec ...

  5. PAT 甲级 1042 Shuffling Machine (20 分)(简单题)

    1042 Shuffling Machine (20 分)   Shuffling is a procedure used to randomize a deck of playing cards. ...

  6. PAT 1042 Shuffling Machine (20 分)

    1042 Shuffling Machine (20 分)   Shuffling is a procedure used to randomize a deck of playing cards. ...

  7. PAT甲级——1042 Shuffling Machine

    1042 Shuffling Machine Shuffling is a procedure used to randomize a deck of playing cards. Because s ...

  8. PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...

  9. 1042. Shuffling Machine (20) - sstream实现数字转字符串

    题目例如以下: Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffli ...

  10. 1042. Shuffling Machine (20)

    Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techn ...

随机推荐

  1. vue2.* 事件 定义方法 执行方法 获取数据 改变数据 执行方法传值 以及事件对象 05

    <template> <div id="app"> <button v-on:click="run1()">执行事件的第一种 ...

  2. Hive学习之路 (十七)Hive分析窗口函数(五) GROUPING SETS、GROUPING__ID、CUBE和ROLLUP

    概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...

  3. Day11 Java内部类

    什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public ...

  4. 【原创】大叔经验分享(53)kudu报错unable to find SASL plugin: PLAIN

    kudu安装后运行不正常,master中找不到任何tserver,查看tserver日志发现有很多报错: Failed to heartbeat to master:7051: Invalid arg ...

  5. [LuoguP1462]通往奥格瑞玛的道路($SPFA+$二分)

    #\(\mathcal{\color{red}{Description}}\) \(Link\) 有一个图,求其在\(1-N\)的最短路小于一个给定值下,点权最大值的最小值. #\(\mathcal{ ...

  6. Altium Ddesigner 栅格 含义

    栅格分为可视栅格(Visible Grid).捕获栅格(snap grid).元件放置捕获栅格(Component Grid).电气栅格(Electrical Grid). 可视栅格:就是编辑过程中看 ...

  7. ios宏定义学习

    宏简介: 宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串).这种替换在预编译时进行,称作 ...

  8. block本质探寻二之变量捕获

    一.代码 说明:本文章须结合文章<block本质探寻一之内存结构>和<class和object_getClass方法区别>加以理解: //main.m #import < ...

  9. 使用Android studio搭建Android环境

    最近安装Android studio遇到了很多问题,现在总结一下安装过程 因为我的电脑是AMD的cpu,好像不能使用虚拟机(具体原因不知道),所以我使用 软件+手机  去开发APP 先说一下使用And ...

  10. 高德地图API(流程法)整理分析

    [高德地图API(流程法)分析]: 前言:公司现在的网约车项目,使用的是高德地图,因为地图导航这一块的功能占比量比较大,为了方便大家对高德地图API的了解和学习使用,使用流程图把高德API分析整理了下 ...