题目链接:Shuffling Machine
1. 题意
题目意思就是按照给定的顺序洗牌
比如说题目所给的五张牌样例S3, H5, C1, D13, J2
洗牌顺序是{4, 2, 5, 3, 1}
所以我们将
S3
移动到第四位H5
移动到第二位C1
移动到第五位D13
移动到第三位J2
移动到第一位
得到的新次序是J2, H5, D13, S3, C1
然后再洗一次得到的次数就是C1, H5, S3, J2, D13
2. 思路
我们不能直接的移动元素来进行变换, 我们得模拟下标的变换
使用两个数组记录移动前的次序和移动后的次序
3. 代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
static final int n = 54;
public static void main(String[] args) throws IOException {
char[] ch = { 'S', 'H', 'C', 'D' };
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 4; i++) {
for (int j = 1; j <= 13; j++) {
StringBuilder bd = new StringBuilder();
bd.append(ch[i]);
bd.append(j);
list.add(bd.toString());
}
if (i == 3) {
list.add("J1");
list.add("J2");
}
}
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
int[] num = new int[60];
for (int i = 0; i < n; i++) {
num[i] = Integer.parseInt(s[i]);
}
int[] start = new int[55];
int[] end = new int[55];
for (int i = 0; i < n; i++) {
start[i] = i;
}
for (int i = 0; i < k; i++) {
for (int j = 0; j < n; j++) {
end[num[j] - 1] = start[j];
}
for (int j = 0; j < n; j++) {
start[j] = end[j];
}
}
for (int i = 0; i < n; i++) {
if (i != 0) {
System.out.print(" ");
}
System.out.print(list.get(start[i]));
}
System.out.println();
}
}