PAT 1042. Shuffling Machine

我的天呐起先各种看不懂题意,题目说“If the number at the i-th position is j, it means to move the card from position i to position j.”我还以为是把第i张牌抽出来,放到当前序列的j位置,一番变化下来,又是删除又是插入,得出的结果还跟样例不一样,也是醉了。

其实题目给出来的数字序列,就是原来的卡片序列 到 洗牌过后的卡片序列 的一个映射。在i位上的牌,洗过以后就跑到j位了。

我的方法是在洗牌过程中仅对数字进行操作,最后再把字符串对应起来、输出。

#include<cstdio>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
string give(char ch,int a){
	string re="";
	if(a<10)
		re=re+ch+((char)(a+'0'));
	else if(a<100)
		re=re+ch+((char)(a/10+'0'))+((char)(a%10+'0'));
	return re;
}
string card[60];
int order[60];
int result[60];
int repeat;
string oupu[60];
int main(){
	int i;
	for(i=1;i<=13;i++)
		card[i-1]=give('S',i);
	for(i=1;i<=13;i++)
		card[12+i]=give('H',i);
	for(i=1;i<=13;i++)
		card[25+i]=give('C',i);
	for(i=1;i<=13;i++)
		card[38+i]=give('D',i);
	card[52]=give('J',1);
	card[53]=give('J',2);
	
	scanf("%d",&repeat);
	for(i=0;i<54;i++){
		result[i]=i;
		scanf("%d",&order[i]);
		order[i]--;
	}
	int j;
	for(i=0;i<54;i++){
		//对于一开始在i位上的牌来说,洗过一次它就跑到order[i]这个位置上去了
		//再洗一次,它就跑到order[order[i]]去了……如此反复,这样的变动一共
		//要进行repeat次
		for(j=0;j<repeat;j++)
			result[i]=order[result[i]];
	}
	
	//洗过reapeat次以后,最开始在i位的牌,就变到result[i]位置去了 
	for(i=0;i<54;i++)
		oupu[result[i]]=card[i];
	for(i=0;i<54;i++){
		cout<<oupu[i];
		if(i<53)printf(" ");
		else	printf("\n");
	}
return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值