【PTA】 Shuffling Machine

7-43 Shuffling Machine(20 分)

Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid "inside jobs" where employees collaborate with gamblers by performing inadequate shuffles, many casinos employ automatic shuffling machines. Your task is to simulate a shuffling machine.

The machine shuffles a deck of 54 cards according to a given random order and repeats for a given number of times. It is assumed that the initial status of a card deck is in the following order:

S1, S2, ..., S13, 
H1, H2, ..., H13, 
C1, C2, ..., C13, 
D1, D2, ..., D13, 
J1, J2
 

where "S" stands for "Spade", "H" for "Heart", "C" for "Club", "D" for "Diamond", and "J" for "Joker". A given order is a permutation of distinct integers in [1, 54]. If the number at the i-th position is j, it means to move the card from position i to position j. For example, suppose we only have 5 cards: S3, H5, C1, D13 and J2. Given a shuffling order {4, 2, 5, 3, 1}, the result will be: J2, H5, D13, S3, C1. If we are to repeat the shuffling again, the result will be: C1, H5, S3, J2, D13.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer K (≤20) which is the number of repeat times. Then the next line contains the given order. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the shuffling results in one line. All the cards are separated by a space, and there must be no extra space at the end of the line.

Sample Input:

2
36 52 37 38 3 39 40 53 54 41 11 12 13 42 43 44 2 4 23 24 25 26 27 6 7

8 48 49 50 51 9 10 14 15 16 5 17 18 19 1 20 21 22 28 29 30 31 32 33

34 35 45 46 47
 

Sample Output:

S7 C11 C10 C12 S1 H7 H8 H9 D8 D9 S11 S12 S13

D10 D11 D12 S3 S4 S6 S10 H1 H2 C13 D2 D3 D4

H6 H3 D13 J1 J2 C1 C2 C3 C4 D1 S5 H5 H11 H12

C6 C7 C8 C9 S2 S8 S9 H10 D5 D6 D7 H4 H13 C5

思路: 

第一次写英文的编程题,刚看上去有点不适应,看习惯了也就好了。

  • 由于数组中的元素为S1这样的数据,所以需要二个数组,一个数组用来存放字符,一个数组用来存放数字。
  • 那么数组定义好了,如何初始化,我代码中初始化的方式有些僵硬,去网上借鉴了网友的方法。
  • 初始化完成需要按要求排序,由于题目中说的是如果i位置的数字为j,那么把i位置上的数字放到j位置上,所以需要一个空白的数组存放新的排序(刚开始我理解成了交换,导致走了不少弯路)。
  • 一次排序完成,可能需要第二次排序。在进行第二次排序之前需要遍历已经排好序的数组将其赋值给排序之前的数组。以便再次进行排序。

 代码:

#include <stdio.h>
const int num=54;
int main()
{
	int k;
	scanf("%d",&k);
	int c[num];
	for(int i=0;i<num;i++)//输入数值,初始化数组
	{
		scanf("%d",&c[i]);
	}
	char a[num];
	int b[num];
	for(int j=0;j<num;j++)//初始化a和b数组
	{
		if((j+1)>=1&&(j+1)<=13){
			a[j]='S';
			b[j]=j+1;
		}else if((j+1)>=14&&(j+1)<=26){
			a[j]='H';
			b[j]=(j+1)-13;
		}else if((j+1)>=27&&(j+1)<=39){
			a[j]='C';
			b[j]=(j+1)-13*2;
		}else if((j+1)>=40&&(j+1)<=52){
			a[j]='D';
			b[j]=(j+1)-13*3;
		}else{
			a[j]='J';
			b[j]=(j+1)-13*4;
		}
	}
	int d[num],e[num];
	for(int jj=0;jj<k;jj++)
	{
		for(int ii=0;ii<num;ii++)//将排序的结果放入新的数组中
		{
			d[c[ii]-1]=a[ii];
			e[c[ii]-1]=b[ii];
		}
		for(int n=0;n<num;n++)//数组赋值
		{
			a[n]=d[n];
			b[n]=e[n];
		}
   }
   for(int m=0;m<num;m++)
   {
   	if(m==num-1){
   	    printf("%c%d",d[m],e[m]);//最后一个不输出空格
    }else{
    	printf("%c%d ",d[m],e[m]);
	}
   }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jiangxiaoshan123/article/details/81460891
今日推荐