【PAT】1042 Shuffling Machine (20分)

思路:

大概就是要对54张牌按照给的顺序进行打乱,把第i张牌放到位置j上,这个操作重复k次。

因为题目中给出的操作已经明确了每个位置上的牌在操作后的位置,所以可以设两个数组start和end,分别存操作前、操作后的牌的位置,在一次操作结束后再用end数组更新start数组的值。

用order数组存牌号(1-54),用mp数组存花色(SHCDJ五个花色),牌号x的花色可以计算的到,是mp[(x-1)/13] 。

那么代码就可以写了。

注意点:

1.注意花色和编号的对应关系,为什么牌的编号要减一,是因为牌号是13的倍数的情况下也属于之前的那个花色。

2.注意输出格式的控制,不允许在一行的末尾多出空格,所以会返回“格式错误”,所以可以在第二个输出开始的每次输出的前面加上空格

这个花色我是真的没想到怎么存,以后看到这种要想怎么用数组来简化操作。。

代码:

#include <cstdio>
#include <string.h>
int order[55];//存放交换的顺序 
char mp[5] = {'S','H','C','D','J'};//存放牌号
int start[55],end[55];
//存放开始时的牌序和结束时的排序 用end覆盖start 
//牌号x的花色是mp[(x-1)/13] 
int main(){
	int k;//重复次数 
	scanf("%d",&k); 
	for (int i = 1; i <= 54; i ++){
		scanf("%d",&order[i]);
		start[i] = i;
	} 
	memset(end,0,sizeof(end));
	for (int i = 1; i <= k; i ++){
		for (int j = 1; j <= 54; j ++){	
			end[order[j]] = start[j];
		}
		for (int j = 1; j <= 54; j ++){
			start[j] = end[j];
		}
	} 
	for (int i = 1; i <= 54; i ++){
		if (i != 1) printf(" ");//控制输出格式
		start[i]--;
		printf("%c%d",mp[start[i]/13],start[i]%13 + 1);	
	}
	return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值