【PAT】1042 Shuffling Machine (20分)

思路:

大概就是要對54張牌按照給的順序進行打亂,把第i張牌放到位置j上,這個操作重複k次。

因爲題目中給出的操作已經明確了每個位置上的牌在操作後的位置,所以可以設兩個數組start和end,分別存操作前、操作後的牌的位置,在一次操作結束後再用end數組更新start數組的值。

用order數組存牌號(1-54),用mp數組存花色(SHCDJ五個花色),牌號x的花色可以計算的到,是mp[(x-1)/13] 。

那麼代碼就可以寫了。

注意點:

1.注意花色和編號的對應關係,爲什麼牌的編號要減一,是因爲牌號是13的倍數的情況下也屬於之前的那個花色。

2.注意輸出格式的控制,不允許在一行的末尾多出空格,所以會返回“格式錯誤”,所以可以在第二個輸出開始的每次輸出的前面加上空格

這個花色我是真的沒想到怎麼存,以後看到這種要想怎麼用數組來簡化操作。。

代碼:

#include <cstdio>
#include <string.h>
int order[55];//存放交換的順序 
char mp[5] = {'S','H','C','D','J'};//存放牌號
int start[55],end[55];
//存放開始時的牌序和結束時的排序 用end覆蓋start 
//牌號x的花色是mp[(x-1)/13] 
int main(){
	int k;//重複次數 
	scanf("%d",&k); 
	for (int i = 1; i <= 54; i ++){
		scanf("%d",&order[i]);
		start[i] = i;
	} 
	memset(end,0,sizeof(end));
	for (int i = 1; i <= k; i ++){
		for (int j = 1; j <= 54; j ++){	
			end[order[j]] = start[j];
		}
		for (int j = 1; j <= 54; j ++){
			start[j] = end[j];
		}
	} 
	for (int i = 1; i <= 54; i ++){
		if (i != 1) printf(" ");//控制輸出格式
		start[i]--;
		printf("%c%d",mp[start[i]/13],start[i]%13 + 1);	
	}
	return 0;
} 

 

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