本文主要是介绍PAT A1042. 洗牌机器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
有54张牌,编号为1~54,初始按编号从小到大排列。另外,这些牌按初始排列给定花色,即从左至右分别为13张S、13张H、13张C、13张D、2张J,如下所示:
s1, S2,…., S13,H1, H2,…, H13,C1, C2,.…, C13,D1, D2,…, D13,J1, J2
接下来执行一种操作,这种操作将牌的位置改变为指定位置。例如有5张牌S3, H5, C1,D13,J2,然后给定操作序列{4,2,5,3,1},因此把S3放到4号位、把H5放到2号位、C1放到5号位、D13放到3号位、J2放到1号位,于是就变成了J2,H5, D13, S3,C1。
现在需要将这种操作执行K次,求最后的排列结果。例如上面的例子中,如果执行第二次操作,那么序列J2, H5, D13,S3,C1就会变成C1,H5,S3,J2,D13。
输入样例
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
输出样例
S7 C11 C10 C12 S1 H7 H8 H9 D8 D9 S11 S12 S13 D10 D11 D12 S3 S4 S6 S10 HI H C13 D2 D3 D4 H6 H3 D13 J1 J2 CI C2 C3 C4 DI S5 H5 HI1 H12 C6 C7 C8 C9 S2 S8 S9 H1O D5 D6 D7 H4 H13 C5
学习收获
①将处理后的数组再一次赋值给原先的数组,这样可以复用数组。
②输出数组时,要想最后没有空格,可以先输出空格:除了第一个元素前面不输出空格,其余元素前面输出空格。
③ 一般来讲,题目中有大量数字,并且题目输出的数字是有规律时,需要找到数字间的规律。例如,这里找花色的规律:假设牌号为x,花色数组为mp[]={‘S’,‘H’,‘C’,‘D’,‘J’},则对应关系为mp[(x-1)/13]。花色下的编号为:(x-1)%13 +1。
代码实现
#include<cstdio>const int N = 54;
int main()
{int start[N+1],end[N+1],next[N+1];char mp[5]={'S','H','C','D','J'};//牌的编号与花色的对应关系 int K;scanf("%d",&K);for(int i=1;i<N+1;i++)scanf("%d",&next[i]);for(int i=1;i<N+1;i++) //初始化:牌 start[i] = i;for(int j=0;j<K;j++) //按照next顺序排序K次 {for(int i=1;i<N+1;i++){end[next[i]] = start[i];}for(int i=1;i<N+1;i++) //将end赋值给start,为下一次排序做准备 {start[i] = end[i];}}for(int i=1;i<N+1;i++){if(i!=1) //输出数组元素时,这样处理,最后没有空格 printf(" ");start[i]--;printf("%c%d",mp[start[i]/13],start[i]%13+1); //编号与花色以及所属花色编号的转换 }return 0;
}
这篇关于PAT A1042. 洗牌机器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!