Shuffling Machine

有54张牌,编号为1~54,初始编号从小到大排列。另外,这些牌按初始排列给定花色,即从左到右分别为13张S,13张H,13张C,13张D,2张J,如下:
S1,S2,···,S13,H1,H2,····H13,C1,C2,···C13,D1,D2,···D13,J1,J2
接下来执行一种操作,这种操作将牌的位置改变为指定位置。例如有五张牌S3,H5,C1,D13,J2,然后给定操作序列{4,2,5,3,1},因此把S3放到4号位置,把H5放到2号位置,C1放到5号位置,D13放到3号位置,J2放到1号位置,于是就变成了J2,H5,D13,S3,C1。
现需要将这种操作执行K次,求最后排列的结果。例如上面的例子中,如果执行第二次操作,那么序列J2,H5,D13,S3,C1就会变成C1,H5,S3,J2,D13

public class ShufflingMachine {


    public static void main(String[] args) {
            //将牌编号,从1号到54号
            int [] start = new int[55];
            //初始化。默认是1号牌放在下表为1的位置,2号牌放在下标为2的位置
            for(int i=1;i<55;i++) {
                start[i] = i;
            }
            //花色数组
            String [] arr = new String[] {"S","H","C","D","J"};
            int [] end = new int[55];
            //洗牌顺序
            int []  next = new int[] {0, 36 ,52, 37, 38, 3, 39, 40, 53, 54, 41, 11, 12 ,13 ,42 ,43, 44, 2, 4, 23,
                    24, 25, 26, 27, 6 ,7 ,8 ,48, 49, 50, 51, 9 ,10, 14, 15, 16, 5, 17, 18, 19, 1,
                    20, 21, 22, 28, 29, 30, 31, 32, 33, 34, 35, 45, 46, 47 };
            for(int n=0;n<2;n++) {
                  for(int j=1;j<55;j++) {
                       end[next[j]] = start[j];
                   }
                   for(int k = 1;k<55;k++) {
                       start[k] = end[k];
                   }
            }
          // 花色 (x-1)/13 ; 序号 (x-1)%13+1
          Arrays.stream(start).forEach(x -> { 
              if(x!=0) {
                  System.out.print( arr[(x-1)/13] +  String.valueOf((x-1)%13+1)+" ");
              }
          });
            
    }
    
}
原文地址:https://www.cnblogs.com/moris5013/p/11498110.html