1. 程式人生 > 其它 >1042 Shuffling Machine (20 分)

1042 Shuffling Machine (20 分)

1. 題目

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

2. 題意

題目中會給出一副54張牌:初始序列為:

S1, S2, ..., S13,

H1, H2, ..., H13,

C1, C2, ..., C13,

D1, D2, ..., D13,

J1, J2

題目會給出洗牌次數K,以及洗牌次序(對應54張牌)。每次洗牌都按照洗牌次序來洗牌,洗牌規則為將第i張牌,根據次序j,調整到j的位置。

例:S1,S2,S3,S4,S5五張牌,洗牌次序為5,1,2,4,3;那麼第一次洗牌完5張牌的次序為S2,S3,S5,S4,S1;再根據洗牌次序5,1,2,4,3進行洗牌;第二次洗牌完次序為S3,S5,S1,S4,S2。

題目要求根據洗牌次數K和洗牌次序,給出最終洗牌結果。

3. 思路——排序

  1. 將初始洗牌次序和牌對應關係記錄在pair對陣列中,並單獨記錄下洗牌次序在陣列orders中。

  2. 每次洗牌根據洗牌次序先後進行排序,排序完後在通過orders陣列更新pair對陣列的洗牌次序。

  3. 重複步驟2K次。

4. 程式碼

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>

using namespace std;

typedef pair<int, string> PII;

int cmp(PII card1, PII card2)
{
	return card1.first < card2.first;
}

int main()
{
	int n = 0;
	cin >> n;
	char chs[]{'S', 'H', 'C', 'D', 'J'};
	int orders[60];
	PII cards[60];
	int k = 1;
	// 這裡主要建立序列號和牌的對應關係,並將序列號單獨記錄在一個數組中 
	for (int i = 0; i < 5; ++i)
	{
		if (i < 4)
		{
			for (int j = 1; j <= 13; ++j)
			{
				cin >> orders[k];
				cards[k].first = orders[k];
				cards[k++].second = chs[i] + to_string(j);
			}
		} else
		{
			cin >> orders[k];
			cards[k].first = orders[k];
			cards[k++].second = "J1";
			cin >> orders[k];
			cards[k].first = orders[k];
			cards[k++].second = "J2";
		}
	}
	// 每進行一次排序,都要將序列號重新更新為輸入時的序列號重新排序
	// 根據題目要求,進行n次重排,相當於進行了n次洗牌 
	while (n--)
	{
		sort(cards + 1, cards + 55, cmp);
		for (int i = 1; i < 55; ++i)
			cards[i].first = orders[i];
	}
	for (int i = 1; i < 55; ++i)
	{
		if (i != 1) cout << " " << cards[i].second;
		else cout << cards[i].second;
	}
	return 0;
}