| 3 | import java.util.Random; |
| 4 | |
| 5 | public class Gear { |
| 6 | private static short[][] cpm = new short[24][3], epm = new short[24][3], eom = new short[27][3]; |
| 7 | private static byte[][] pd = new byte[3][576]; |
| 8 | private static String[] turn = {"U", "R", "F"}; |
| 9 | private static String[] suff = {"'", "2'", "3'", "4'", "5'", "6", "5", "4", "3", "2", ""}; |
| 10 | private static int[] seq = new int[8]; |
| 11 | |
| 12 | static { |
| 13 | int[] arr = new int[4]; |
| 14 | for (int i = 0; i < 24; i++) { |
| 15 | for (int j = 0; j < 3; j++) { |
| 16 | Utils.idxToPerm(arr, i, 4, false); |
| 17 | Utils.swap(arr, 3, j); |
| 18 | cpm[i][j] = (short) Utils.permToIdx(arr, 4, false); |
| 19 | } |
| 20 | } |
| 21 | for (int i = 0; i < 24; i++) { |
| 22 | for (int j = 0; j < 3; j++) { |
| 23 | Utils.idxToPerm(arr, i, 4, false); |
| 24 | switch (j) { |
| 25 | case 0: Utils.circle(arr, 0, 3, 2, 1); break; |
| 26 | case 1: Utils.swap(arr, 0, 1); break; |
| 27 | case 2: Utils.swap(arr, 1, 2); break; |
| 28 | } |
| 29 | epm[i][j] = (short) Utils.permToIdx(arr, 4, false); |
| 30 | } |
| 31 | } |
| 32 | arr = new int[3]; |
| 33 | for (int i = 0; i < 27; i++) { |
| 34 | for (int j = 0; j < 3; j++) { |
| 35 | Utils.idxToOri(arr, i, 3, false); |
| 36 | arr[j] = (arr[j] + 1) % 3; |
| 37 | eom[i][j] = (short) Utils.oriToIdx(arr, 3, false); |
| 38 | } |
| 39 | } |
| 40 | //int n; |
| 41 | for (int i = 0; i < 3; i++) { |
| 42 | for (int j = 1; j < 576; j++) pd[i][j] = -1; |
| 43 | pd[i][0] = 0; |
| 44 | for (int d = 0; d < 5; d++) { |
| 45 | //n = 0; |
| 46 | for (int j = 0; j < 576; j++) |
| 47 | if (pd[i][j] == d) |
| 48 | for (int k = 0; k < 3; k++) { |
| 49 | int p = j; |
| 50 | for (int m = 0; m < 11; m++) { |
| 51 | int e = p % 24; |
| 52 | p = p / 24; |
| 53 | p = cpm[p][k]; |
| 54 | e = epm[e][(k + i) % 3]; |
| 55 | p = 24 * p + e; |
| 56 | if (pd[i][p] == -1) { |
| 57 | pd[i][p] = (byte) (d + 1); |
| 58 | //n++; |
| 59 | } |
| 60 | } |
| 61 | } |
| 62 | //System.out.println(d+" "+n); |