PAT 1042 shuffling machine 翻译 分析 代码

题目:1042 shuffling machine (20)(20 分)【洗牌程序

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.

【    花色介绍:{S,H,C,D,J}

       程序介绍:给出五张卡片S3, H5, C1, D13,J2,并且给出洗牌顺序{4,2,5,3,1},结果会变为{J2,H5,D13,S3,C1}

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.


每个输入的文件都包括一个测试用例。在每个例子中,第一行都包括一个交换次数K,接下来的一行给出命令,输出行中的所有代表卡牌的数字都要被一个“ ”分开。

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

对每个测试数据,在同一行输出洗牌结果,所有的代表卡牌的数字被“ ”空格分开,并且在行尾后不允许出现空格!
【对上面这个要求的解读是,不允许出现printf("%c%d ,color[start[i]/13],start[i]%13+1);的格式,注意!!! %c%d后面的“空格”不允许存在!否则与输出要求不符!】

【注】:以下分析所在为代码注释,通过注释可以分析得到此题答案。

【注】:此代码是由Dev c++ 5.11 所写,运用c语言。  其他方法例如c++,后续会另写博客给出方式。惊讶

/**************************************************************************************************************************/

#include<stdio.h>
//#define P 54
int main()
{
char color[5]={'S','H','C','D','J'};	                //color为花色数组 ; 
int P=54;	//本题建议使用int 写死P的数值;define定义P值,会使程序整体运行时间变长  define 384ms  int 256ms 
int start[P],end[P],operate[P];	    	        //start为初始卡牌数组;end为操作后卡牌数组;operate为操作次序数组 ; 
int K,i;
for(i=0;i<P;i++)	//初始化填充start数组 ; 
{
start[i]=i+1;
}


scanf("%d",&K);	//输入变化的次数 


for(i=0;i<P;i++) //输入操作变化的数组 
{
scanf("%d",&operate[i]);
}	
/*****************数据检查*********************
for(i=0;i<P;i++)
{	//输出初始化的start[i]数组,检查是否初始化正确。运行时注释掉本段; 
printf("%d ",start[i]);
}	
for(i=1;i<=P;i++)	//运行时注释掉本段 
{
printf("%d ",operate[i]);
}
/**********************************************/


/***********************************主要函数***************************************/	


for(int step = 0;step < K; step++)             //执行K次操作——对start数组进行修改的次数 ; 
{
for(i=0;i<P;i++)
{
end[operate[i]-1]=start[i];	    //根据operate数组的指令交换指定位置的start与end; 
}
for(i=0;i<P;i++)
{
start[i]=end[i];                //再次交换start与end数组,使start数组成为进行了1次位置变化的数组,方便进行后续操作;	
} 
}
for(i=0;i<P;i++)
{
start[i]--;
if(i!=0)printf(" ");
printf("%c%d",color[start[i]/13],start[i]%13+1);	
}
 	return 0;
 } //唱晚,我爱你啊。 2018年7月2日17:40:13

/**********************************************************************************/

猜你喜欢

转载自blog.csdn.net/qq_42319613/article/details/80864323