首先是字符数组与结构体的两个应用比较,牌组s1,s2,s3...,如果用字符数组是不能够把s1捆绑在一起的,观察发现牌组都是一个花色捆绑一个数字,可以联想到结构体。
其次因为涉及交换,可以联想到交换需要一个临时temp结构体来存储,洗牌是重复覆盖行为,所以最后是与自己交换。
期间要注意的是temp.suit[order[i]-1],这里是要减1的,因为数组从0开始。
还有一个数学小发现就是开头for(int i=0;i<13;i++)是i<13,因为牌组也是有规律的,每隔十三张牌一个花色,且数字依次是从1到13,所以后续可为i+13,i+26,i+39。
还有就是格式小问题,最后输出没有空格,所以最后要单独拿出来输出。
代码如下:
# include <iostream>
using namespace std;
int main(){
struct cards{
char suit[54];
int num[54];
};
cards primary;
for(int i=0;i<13;i++){
primary.suit[i] = 'S';
primary.suit[i+13] = 'H';
primary.suit[i+26] = 'C';
primary.suit[i+39] = 'D';
}
primary.suit[52] = primary.suit[53] = 'J';
for(int j=0;j<13;j++){
primary.num[j] = primary.num[j+13] = primary.num[j+26] = primary.num[j+39] = j+1;
}
primary.num[52] = 1;
primary.num[53] = 2;
int n;
int order[54];
cin>>n;
for(int i=0;i<54;i++){
cin>>order[i];
}
while(n--){
cards temp;
for(int i=0;i<54;i++){
temp.suit[order[i]-1] = primary.suit[i];
temp.num[order[i]-1] = primary.num[i];
}
for(int j=0;j<54;j++){
primary.suit[j] = temp.suit[j];
primary.num[j] = temp.num[j];
}
}
for(int i=0;i<53;i++){
cout<<primary.suit[i]<<primary.num[i]<<" ";
}
cout<<primary.suit[53]<<primary.num[53]<<endl;
return 0;
}