题意:给出一种洗牌的方式,按照此方式洗牌k次,问最后的排列。
思路:把牌和位置放在一起,洗牌k次,排序后输出即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef pair<string, int> P;
int k, pos;
P p[56];
int po[1000];
bool cmp(P p1, P p2) {
return p1.second < p2.second;
}
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
cin >> k;
for (int i = 1; i <= 54; i++) {
scanf("%d", &pos); string s = "";
po[i] = pos;
if (i <= 13) {
s = "S"; int t = i;
if (t >= 10) {
s += ('1');
t %= 10;
}
s += ('0'+t);
// s = ("S" + ('0'+i));
} else if (i <= 26) {
s = "H"; int t = i-13;
if (t >= 10) {
s += ('1');
t %= 10;
}
s += ('0'+t);
// s = ("H" + ('0'+(i-13)));
} else if (i <= 39) {
s = "C"; int t = i-26;
if (t >= 10) {
s += ('1');
t %= 10;
}
s += ('0'+t);
// s = ("C" + ('0'+(i-26)));
} else if (i <= 52) {
s = "D"; int t = i-39;
if (t >= 10) {
s += ('1');
t %= 10;
}
s += ('0'+t);
// s = ("D" + ('0'+(i-39)));
} else {
s = "J"; int t = i-52;
if (t >= 10) {
s += ('1');
t %= 10;
}
s += ('0'+t);
// s = ("J" + ('0'+(i-52)));
}
p[i] = make_pair(s, pos);
}
for (int i = 1; i <= 54; i++) {
for (int j = 0; j < k-1; j++) {
p[i].second = po[p[i].second];
}
}
sort(p+1, p+1+54, cmp);
for (int i = 1; i <= 54; i++) {
if (i > 1) cout << " ";
cout << p[i].first;
}
cout << endl;
return 0;
}