思路:
大概就是要對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;
}