题目: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
【对每个测试数据,在同一行输出洗牌结果,所有的代表卡牌的数字被“ ”空格分开,并且在行尾后不允许出现空格!】【注】:以下分析所在为代码注释,通过注释可以分析得到此题答案。
【注】:此代码是由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
/**********************************************************************************/