| 91 | private static String[] turn = {"R", "U", "L", "B"}; |
| 92 | private static String[] suff = {"'", ""}; |
| 93 | private static boolean search(int ct, int cp, int co, int d, int l, int[] seq) { |
| 94 | if (d == 0) return ct == 0 && co == 0 && cp == 0; |
| 95 | if (ctd[ct] > d || cd[co * 36 + cp] > d) return false; |
| 96 | if (l == -2) { |
| 97 | int n = r.nextInt(8); |
| 98 | int k = n / 2; |
| 99 | n %= 2; |
| 100 | int p = ct, q = cp, r = co; |
| 101 | for (int m = 0; m <= n; m++) { |
| 102 | p = ctm[p][k]; q = cpm[q][k]; r = com[r][k]; |
| 103 | } |
| 104 | if (search(p, q, r, d-1, k, seq)) { |
| 105 | seq[d] = k << 1 | n; |
| 106 | return true; |
| 107 | } |
| 108 | } else for (int k = 0; k < 4; k++) |
| 109 | if (k != l) { |
| 110 | int p = ct, q = cp, r = co; |
| 111 | for (int m = 0; m < 2; m++) { |
| 112 | p = ctm[p][k]; q = cpm[q][k]; r = com[r][k]; |
| 113 | if (search(p, q, r, d-1, k, seq)) { |
| 114 | seq[d] = k << 1 | m; |
| 115 | return true; |
| 116 | } |
| 117 | } |
| 118 | } |
| 119 | return false; |
| 120 | } |
| 121 | |
| 122 | public static String scramble() { |
| 123 | int ct = r.nextInt(360), cp, co; |