PAT A 1042 Shuffling Machine (20)

1042 Shuffling Machine (20)(20 分)提问

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:

扫描二维码关注公众号,回复: 2346269 查看本文章
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

 代码:

#include<cstdio>
const int N=54;
int main(){
	char mp[5]={'S','H','C','D','J'};
	int start[N+1],end[N+1],next[N+1];
	int K;
	scanf("%d",&K);
	
	for(int i=1;i<=N;i++){
		scanf("%d",&next[i]);
	}
	
	//初始化牌的编号,首先只要认清楚每张牌都只有一个编号,最后根据编号再去寻找数学公式对应起来 
	for(int i=1;i<=N;i++){
		start[i]=i;
	} 
	while(K--){
		for(int i=1;i<=N;i++){
			end[next[i]]=start[i];
		}
		for(int i=1;i<=N;i++){
			start[i]=end[i];//start数组里面是存放的新的排序后的 
		}
	}
	for(int i=1;i<=N;i++){
		start[i]--;//特别注意,start是从1开始,而mp是从0开始 
		printf("%c%d",mp[start[i]/13],start[i]%13+1);
		if(i!=N)printf(" ");
	}
	
}

这个题目的话,我觉得读懂题目要冷静,不要觉得哇!看不懂,不会做,其实题目都不是很难的,只要沉着冷静。

首先,这个题目的话,要知道要输入那么一长串的操作,肯定要有一个数组存储,我们把它命名为next[N+1].

然后仔细思考几个点:

1:既然题目是把最初始的牌的顺序,按照操作数组里面的顺序去放置,那么我肯定先要把初始的牌设置好,怎么设置?当然还是数组,而且会发现每一张牌都是唯一的,都会有它自己的牌号。所以,初始化牌的编号。。。easy,for循环咯

2:读懂题目例题,应该就会懂的它的意思就是,把按顺序的牌的每一位放置到操作数组对应的那个位置上面去,这样一来,我肯定还需要一个数组,去放置一遍操作完成后的牌。

3:目前位置我有3个数组了,初始化的数组start,操作数组next,一遍操作后的牌的数组end,但是现在我需要的是反复操作这样的一个过程,如何做到了?很简单,把end赋值给start就可以啦,让赋值后的start成为下一次操作的对象,以此往复咯~

4:这个题目如果做到这里,就完成80%了。题目要求的是,不是让你输出牌的编号哦,而是字符+数字,这时候就需要你推导一下了。把S,H,C,D,J 5个花色存入一个数组里面mp,在这里要记住编号是从1开始的,所以start[i]--;

     花色:mp[编号/13],有0,1,2,3,4,而数字:编号%13+1;

猜你喜欢

转载自blog.csdn.net/LIUJIALING_lala/article/details/81174662