[PAT-A 1042]Shuffling Machine

非 Y 不嫁゛ 提交于 2020-01-08 21:05:32

在这里插入图片描述
题目大意
有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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!