A1042
洗牌,共洗k次,每次将将原先的牌洗进输入好的位置。
步骤:
1 设置次数k,输入位置数列next[55],填充初始牌序start[55];
2 end[next[i]]=start[i]把新的牌序赋值给end数组,并将end数组重新赋值给start数组,共重复k次;
3 由于设置的花色数组mp[5]的序号是0-4,即用1-54/13后,结果对应相应的mp元素。因为n*13/13==1,需要将数组值全部-1,得到正确的mp序号。
在数组值全部-1后,start[i]%13的结果为0-12,需要start[i]%13+1来得到正确的结果1-13
注:由于1-13%13的结果是1,2,3…12,0,必须将数组的整体值-1后取余得到0,1,2…12后再+1才能得到正确结果。否则13的倍数牌将显示为0.
1 #include<stdio.h> 2 int main(){ 3 char mp[5]={'S','H','C','D','J'}; 4 int start[55],end[55],next[55]; 5 int k; 6 scanf("%d",&k); 7 for(int i=1;i<=54;i++){ 8 scanf("%d",&next[i]); 9 start[i]=i; 10 } 11 for(int j=0;j<k;j++){ 12 for(int i=1;i<=54;i++){ 13 end[next[i]]=start[i]; 14 } 15 for(int i=1;i<=54;i++){ 16 start[i]=end[i]; 17 } 18 } 19 for(int i=1;i<=54;i++){ 20 start[i]--; 21 printf("%c%d",mp[start[i]/13],start[i]%13+1); 22 if(i!=54) printf(" "); 23 } 24 return 0; 25 }