我的天呐起先各种看不懂题意,题目说“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;
}