题目链接
刚开始没有想太多,直接把每个牌面值都作为了string对象。由于VS2017有替换功能,输了S1~S13之后,替换即可,不需要全部手敲。这样的好处是不需要多想,但是代码有些冗杂。
#include<iostream>
#include<string>
using namespace std;
int main() {
string s[55] = {" ", "S1","S2","S3","S4","S5","S6","S7","S8","S9","S10","S11","S12","S13",
"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13",
"C1","C2","C3","C4","C5","C6","C7","C8","C9","C10","C11","C12","C13",
"D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12","D13" ,
"J1","J2" };
string an[55];
int order[55],k;
cin >> k;
for (int i = 1; i <= 54; i++) {
cin >> order[i];
}
while (k--) {
for (int i = 1; i <= 54; i++) {
an[order[i]] = s[i];
}
for (int i = 1; i <= 54; i++) {
s[i] = an[i]; //保存每次操作的结果
}
}
cout << an[1];
for (int i = 2; i <= 54; i++) {
cout << " " << an[i];
}
return 0;
}
观察可以发现,最开始的牌面顺序是很有规律的,因此可以根据顺序确定牌面值。
#include<iostream>
using namespace std;
int main() {
char ma[] = "SHCDJ"; //映射表
int an[55],t[55],order[55], k;
cin >> k;
for (int i = 1; i <= 54; i++) {
cin >> order[i];
t[i] = i; //初始化
}
while (k--) {
for (int i = 1; i <= 54; i++) {
an[order[i]] = t[i];
}
for (int i = 1; i <= 54; i++) {
t[i] = an[i]; //保存每次操作的结果
}
}
for (int i = 1; i <= 54; i++) {
if (i != 1) cout << " ";
an[i] = an[i] - 1;
cout << ma[an[i]/13]<<an[i]%13+1;
}
return 0;
}