PTA刷題筆記(C語言) | 7-43 Shuffling Machine (20分)

開始刷題,感覺代碼量和基礎太渣了,導致數據結構不會,重頭慢慢刷吧~
在這裏插入圖片描述


1、題目

在這裏插入圖片描述
在這裏插入圖片描述
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


翻譯:

洗牌是將一副撲克牌隨機排列的過程。由於標準洗牌技術被視爲薄弱環節,爲了避免員工通過不充分的洗牌與賭徒合作的“內部工作”,許多賭場都採用了自動洗牌機。你的任務是模擬洗牌機。

這臺機器按照給定的隨機順序洗牌一副54張牌,並重復一定次數。假設卡片組的初始狀態如下:
S1,S2,…,S13,
H1,H2,…,H13,
C1,C2,…,C13,
D1,D2,…,D13,
J1,J2

其中“S”代表“黑桃”,“H”代表“心”,“C”代表“俱樂部”,“D”代表“鑽石”,“J”代表“小丑”。給定的順序是[1,54]中不同整數的排列。如果第i個位置的數字是j,則意味着將卡從位置i移動到位置j。例如,假設我們只有5張卡:S3、H5、C1、D13和J2。給定洗牌順序{4,2,5,3,1},結果將是:J2,H5,D13,S3,C1。如果我們再次重複洗牌,結果將是:C1、H5、S3、J2、D13。

輸入規格:

每個輸入文件包含一個測試用例。對於每種情況,第一行包含一個正整數K(≤20),這是重複次數。下一行包含給定的順序。一行中的所有數字都用空格隔開。

輸出規格:

對於每個測試用例,在一行中打印洗牌結果。所有的卡片都被一個空格隔開,行的末尾不能有多餘的空格。


2、代碼

#include<stdio.h>
// 洗牌前的順序
char *a[]={"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"};
int main(){
	int N;
	scanf("%d",&N);
	// 排列順序數組c 
	int i,c[55];
	// 洗牌結果
	char *r[55];
	for(i=1;i<=54;i++){
		scanf("%d",&c[i]);
	}
	int j,k;
	for(k=0;k<N;k++){
		// 將牌按照讀入的順序c[]讀入到數組r[]中 
		for(j=1,i=0;j<=54;j++,i++){
			r[c[j]]=a[i];
		}
		// 將新的排序賦給a[],不然a[]還是最初的牌序
		for(i=0,j=1;i<54;i++,j++){
			a[i]=r[j];
		}
	}
	int flag=0;
	for(i=1;i<=54;i++){
		if(!flag){
			printf("%s",r[i]);	
		}
		else{
			printf(" %s",r[i]);
		}
		flag++;
	}
	return 0;
} 

在這裏插入圖片描述

3、討論

這個題很有意思的哈,比如數組需要用指針數組,比如需要重新賦值牌序,不然都會有問題!!!

妙啊!!!
在這裏插入圖片描述
在這裏插入圖片描述

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