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