0%

PAT A1042 Shuffling Machine

我的解法

解题思路:先写出所有的牌的顺序,存放到vector中,方便直接复制。然后int型数组存放随机洗牌的order,定义一个中间变量vector,循环题目给出的洗牌次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int maxn=55;
string strs[]={"-1",
"S1", "S2", "S3","S4","S5","S6","S7","S8","S9","S10","S11","S12","S13",
"H1", "H2", "H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13",
"C1", "C2", "C3","C4","C5","C6","C7","C8","C9","C10","C11","C12","C13",
"D1", "D2", "D3","D4","D5","D6","D7","D8","D9","D10","D11","D12","D13",
"J1", "J2"
};
vector<string> vec(strs,strs+maxn);
vector<string> temp(maxn);
int order[maxn];
int n;
int main(){
cin>>n;
for(int i=0;i<54;i++){
cin>>order[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<54;j++){
temp[order[j]]=vec[j+1];
}
vec=temp;
}
for(int i=1;i<54;i++){
cout<<vec[i]<<" ";
}
cout<<vec[54];
return 0;
}

算法笔记解法

解题思路:初始化一个1~54的整型数组表示牌的初始顺序,定义一个char型数组表示五个前缀字母,最后根据洗牌后的顺序找到对应的字符串。每个牌对应一个序号是不变的,所以最后可以根据序号找到。时间快了2ms!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <cstdio>
const int N=54;
int n;
int order[N];//洗牌随机位置
int deck[N+1];//牌的顺序
int temp[N+1];//中间变量
char ch[]={'S','H','C','D','J'};

int main(){
scanf("%d",&n);
for(int i=0;i<N;i++){
scanf("%d",&order[i]);
}
//初始化牌的顺序
for(int i=1;i<=N;i++){
deck[i]=i;
}
for(int i=0;i<n;i++){
for(int j=0;j<N;j++){//根据随机位置调整牌的顺序
temp[order[j]]=deck[j+1];
}
for(int j=1;j<=N;j++){
deck[j]=temp[j];//将中间变量复制给deck,方便重复洗牌
}
}
//输出
for(int i=1;i<=N;i++){
if(i!=1) printf(" ");
printf("%c%d",ch[(deck[i]-1)/13],(deck[i]-1)%13+1);
}

return 0;
}

本文标题:PAT A1042 Shuffling Machine

文章作者:GavinYGM

发布时间:2020年08月20日 - 17:08

最后更新:2020年08月20日 - 23:08

原始链接:http://www.gavinygm.cn/2020/08/20/PAT-A1042-Shuffling-Machine/

许可协议: 转载请保留原文链接及作者。