题目大意
有54张牌,初始编号由大至小排列,给定初始花色S H C D 各13张 J2张
给定一个操作序列为洗牌的操作序列,k为洗牌的次数,求最终的洗牌序列
如5张牌{ S3, H5, C1, D13,J2} 给定序列{4, 2, 5, 3, 1},则执行一次的序列为{ J2, H5, D13, S3, C1},再执行一次的序列为{ J2, H5, D13, S3, C1} ,即将序列按照给定的顺序重新排序S3放在第四张,H5放在第2张…
思路:
1.确定顺序:
54张牌按1-54编号
定义start[],next[],end[]数组,其中start[]存放初始序列,next[]中存放洗牌序列,end[]中存放重新排序之后的序列
初始化start[i]=i,洗牌过程即为end[next[i]]=start[i]
一次结束后将end赋值为start作为下一次的初始序列
2.输出
需要对应编号与牌的花色与序号 定义char mp[5] = { ‘S’,‘H’,‘C’,‘D’,‘J’ };保存花色
则mp[start[i]/13]即为对应花色,start[i]%13即为对应编号
注意若start[i]%13==0要特殊处理,即输出{mp[start[i]/13-1]13}
最后一个没有空格
AC
//PAT_A_1042
#include<cstdio>
using namespace std;
const int N = 54;
char mp[5] = { 'S','H','C','D','J' };
int start[N + 1], end[N + 1], next[N + 1];
int main() {
int k;//shuffles times;
(void)scanf("%d", &k);
for (int i = 1; i <= N; i++) {
start[i] = i;
}
for (int i = 1; i <= N; i++) {
(void)scanf("%d", &next[i]);
}
for (int step = 0; step < k; step++) {
for (int i = 1; i <= N; i++) {
end[next[i]] = start[i];
}
for (int i = 1; i <= N; i++) {
start[i] = end[i];
}
}
//输出
for (int i = 1; i <= N; i++) {
if (start[i] % 13 == 0) {
printf("%c%d", mp[start[i] / 13 - 1], 13);
}
else printf("%c%d", mp[start[i] / 13], start[i] % 13);
if (i < N)printf(" ");
}
return 0;
}
来源:CSDN
作者:学姐你好高冷
链接:https://blog.csdn.net/weixin_44699689/article/details/103896415