博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1042 Shuffling Machine
阅读量:6956 次
发布时间:2019-06-27

本文共 4484 字,大约阅读时间需要 14 分钟。

一、题目描述

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 
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'<
<<' '; } else{ cout<<'S'<
=13 && after[i]<=25){ //H1--H13 if(i<53){ cout<<'H'<
<<' '; } else{ cout<<'H'<
=26 && after[i]<=38){ //C1--C13 if(i<53){ cout<<'C'<
<<' '; } else{ cout<<'C'<
=39 && after[i]<=51){ //D1--D13 if(i<53){ cout<<'D'<
<<' '; } else{ cout<<'D'<

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

  1. 比如序列与花色的对应,可以用hash的思想进行映射,不必给每种情况一个if,因为他们是有规律的。
  2. 再比如每个数组下标从1开始存放数据,在计算对应的时候更加简便。
#include 
using namespace std;const int N=54;int before[N+1],after[N+1],change[N+1];/*1~13--S1~S1314~26--H1~H1327~39--C1~C1340~52--D1~D1353~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<

转载于:https://www.cnblogs.com/MarkKobs-blog/p/10446028.html

你可能感兴趣的文章
代理模式小记【原创】
查看>>
.NET开发技巧——从Winform穿越到WPF
查看>>
2135亿背后的双11项目协作怎么玩?
查看>>
DRDS SQL 审计与分析——全面洞察 SQL 之利器
查看>>
微信小程序:模板消息推送实现
查看>>
CodePush自定义更新弹框及下载进度条
查看>>
搞定PHP面试 - 深入了解引用
查看>>
自己总结的php开发中用到的工具
查看>>
小程序视频或音频自定义可拖拽进度条
查看>>
PHP导出超大的CSV格式的Excel表方案
查看>>
Mac 环境下如何生成Git shh key
查看>>
webpack4 多页面配置 功能齐全 开箱即用
查看>>
jenkins 使用磁盘检查插件 disk check plugin
查看>>
支付宝H5支付配置项用处说明
查看>>
使用 Ruby 拓展 Vim
查看>>
java并发编程学习10--同步器--倒计时门栓
查看>>
centos7下安装LNMP(nginx+PHP7.1.9+mysql5.7)
查看>>
实现compose的五种思路
查看>>
【228天】黑马程序员27天视频学习笔记【Day27-上】
查看>>
NodeAPI学习之Buffer
查看>>