PTA-起步能力自測題(五) Shuffling Machine C++

 

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

問題解釋:

有一定的英文基礎應該不會出現讀不懂題目的情況,該題主要講的是將牌根據一個亂序的序列來排列,該序列表示的是待洗的牌對應地根據序列的數值放到數值所對應的位置,其中需要確定洗牌次數,要求是把洗完後的牌序列輸出。

注意事項:

牌的信息用string數組方便一些,關鍵點在於把牌放到亂序序列指示的位置,簡單點的想法把牌放到新的序列上,然後更新,進行“洗牌次數次”的的循環。

代碼參考(運行環境Visual Studio):

#include<iostream>
#include<string>
using namespace std;



int main(){
	int times;
	cin>>times;
	int order[54];
	for(int i=0;i<54;i++){
		cin>>order[i];
	}
	string card[54]={"S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "S10", "S11", "S12", "S13", 
		      "H1", "H2", "H3", "H4", "H5", "H6", "H7", "H8", "H9", "H10", "H11", "H12", "H13", 
			  "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", 
			  "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", 
			  "J1", "J2"};

	string shuffledCard[54];
	
	while(times--){

		for(int i=0;i<54;i++){
			shuffledCard[order[i]-1]=card[i];
		}
		for(int i=0;i<54;i++){
			card[i]=shuffledCard[i];
		}

		
	}

	for(int i=0;i<54;i++){
		if(i!=53){
			cout<<card[i]<<' ';
		}
		else
			cout<<card[i];
	}
	
	return 0;
} 

碎碎念:

1.本來自己在Dev C++運行上面相同的代碼,結果不對,然後懷疑了自己很久,只好放到pta跑一下,但結果居然是對的!

2.爲了使代碼風格好看一些,我寫了以下的代碼,結果發現不對:

#include<iostream>
#include<string>
using namespace std;

string *createCard();
string *shuffleCard(string *card,int *order,int N);
void printCardOrder(string *card);

int main(){
	int times;
	cin>>times;
	int order[54];
	for(int i=0;i<54;i++){
		cin>>order[i];
	}
	string *preCard=createCard();

	string *postCard=shuffleCard(preCard,order,times);

	printCardOrder(postCard);
} 

string *createCard(){
	string *temp=new string[54]{"S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "S10", "S11", "S12", "S13", 
		      "H1", "H2", "H3", "H4", "H5", "H6", "H7", "H8", "H9", "H10", "H11", "H12", "H13", 
			  "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", 
			  "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13", 
			  "J1", "J2"};
	
	return temp;
}

string *shuffleCard(string *card,int *order,int N){
	string *shuffledCard = new string[54];

	while(N--){
		for(int i=0;i<54;i++){
			shuffledCard[order[i]-1]=card[i];
		}
		card = shuffledCard;
		
	}
	return card;
}

void printCardOrder(string *card){
	for(int i=0;i<54;i++){
		if(i!=53){
			cout<<card[i]<<' ';
		}
		else
			cout<<card[i];
	}
}

考慮的是動態數組以及指針概念掌握不太好的原因,可能以致於內存空間分配混亂,傳參錯誤,導致錯誤的結果:

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
H12 C11 C10 C12 D1 D2 D3 D4 D8 D9 S11 S12 S13 D10 D11 D12 S5 H5 H11 C6 C7 C8 C13 D2 D3 D4 C13 C9 D13 J1 J2 C13 D5 D6 D7 D1 S5 H5 H11 H12 C6 C7 C8 C9 H4 H13 C5 C13 D5 D6 D7 H4 H13 C5

確切原因不清楚,還是以後回過頭來看看吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章