1. 程式人生 > >PAT A 1042 Shuffling Machine (20)

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:

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;