题目描述
知识点
模拟题
结果
实现
码前思考
- 首先,我们一定不要直接就存储字符串编号,如‘J1’,我们应该存储其数字编号,在最后输出的时候才转换为字符串
代码实现
//字符数组的使用掌握不好!
#include "bits/stdc++.h"
using namespace std;
int main(){
//设置三个数组,数组下标全部从1开始
//洗牌顺序数组
int sorder[60];
//未洗牌前数组
int pre[60];
//洗牌后的数组
int after[60];
//初始化最开始的pre数组,最后才输出字符
for(int i=1;i<=54;i++){
pre[i] = i;
}
int k;
//下面读入数据
scanf("%d",&k);
for(int i=1;i<=54;i++){
scanf("%d",&sorder[i]);
}
while(k--){
for(int i=1;i<=54;i++){
after[sorder[i]] = pre[i];
}
//赋值过去
for(int i=1;i<=54;i++){
pre[i] = after[i];
}
}
//数组下标从一开始,下面进行输出
for(int i=1;i<=54;i++){
if(after[i]<=13){
printf("S%d",after[i]);
}else if(after[i]>=14 && after[i]<=26){
printf("H%d",after[i]-13);
}else if(after[i]>=27 && after[i]<=39){
printf("C%d",after[i]-26);
}else if(after[i]>=40 && after[i]<=52){
printf("D%d",after[i]-39);
}else if(after[i]>=53 && after[i]<=54){
printf("J%d",after[i]-52);
}
if(i!=54){
printf(" ");
}
}
return 0;
}
码后反思
- 《算法笔记》上面使用了一个字符数组来表示’S’,‘H’,‘C’,‘D’,‘J’,比我的一串if else要好很多!
- 其实我是一开始偷看了之前的答案才想到要用数字编号而不是字符编号的,唉,不行呀。。。
二刷代码
- 这个时候已经用
string
用习惯了,反手就是string
; - 但是显然的是:数字编码的方式要比我这种用
string
要快上很多倍;
//数组下标从1开始,使用string报平安
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int maxn =55;
int main(){
vector<string> pre;
vector<string> next(55);
string head[4] = {"S","H","C","D"};
int order[55];
pre.push_back("");
//生成一副牌的亚子
for(int i=0;i<4;i++){
for(int j=1;j<=13;j++){
pre.push_back(head[i]+to_string(j));
}
}
pre.push_back("J1");
pre.push_back("J2");
int k;
scanf("%d",&k);
for(int i=1;i<=54;i++){
scanf("%d",&order[i]);
}
for(int i=0;i<k;i++){
for(int j=1;j<=54;j++){
next[order[j]] = pre[j];
}
pre=next;
}
cout<<pre[1];
for(int i=2;i<=54;i++){
cout<<" "<<pre[i];
}
return 0;
}
柳婼的数字编码代码:
#include <cstdio>
using namespace std;
int main() {
int cnt;
scanf("%d", &cnt);
int start[55], end[55], scan[55];
for(int i = 1; i < 55; i++) {
scanf("%d", &scan[i]);
end[i] = i;
}
for(int i = 0; i < cnt; i++) {
for(int j = 1; j < 55; j++)
start[j] = end[j];
for(int k = 1; k < 55; k++)
end[scan[k]] = start[k];
}
char c[6] = {"SHCDJ"};
for(int i = 1; i < 55; i++) {
end[i] = end[i] - 1;
printf("%c%d", c[end[i]/13], end[i]%13+1);
if(i != 54) printf(" ");
}
return 0;
}