public static void init() { if (ini) return; Tower.init(); int[] arr = new int[8]; /* 0 1 * 3 2 * * 4 5 * - 6 */ for (int i = 0; i < 5040; i++) { for (int j = 0; j < 3; j++) { Im.set7Perm(arr, i); switch (j) { case 0: Im.cir(arr, 0, 3, 2, 1); break; // Uw case 1: Im.cir(arr, 1, 2, 5, 6); break; // R case 2: Im.cir(arr, 2, 3, 4, 5); break; // F } epm[i][j] = (short) Im.get7Perm(arr); } } for (int i = 0; i < 729; i++) { for (int j = 0; j < 3; j++) { Im.idxToZori(arr, i, 3, 7); switch (j) { case 0: Im.cir(arr, 0, 3, 2, 1); break; // Uw case 1: Im.cir(arr, 1, 2, 5, 6); arr[1] += 2; arr[2]++; arr[5] += 2; arr[6]++; break; // R case 2: Im.cir(arr, 2, 3, 4, 5); arr[2] += 2; arr[3]++; arr[4] += 2; arr[5]++; break; // F } eom[i][j] = (short) Im.zoriToIdx(arr, 3, 7); } } // n = 1; for (int i = 1; i < 5040; i++) { Im.set7Perm(arr, i); if (checkEp1(arr)) { epd[i] = 0; // n++; } else epd[i] = -1; } // System.out.println("0 "+n); epd[0] = 0; for (int d = 0; d < 4; d++) { for (int i = 0; i < 5040; i++) if (epd[i] == d) for (int k = 0; k < 3; k++) for (int y = i, m = 0; m < 3; m++) { y = epm[y][k]; if (epd[y] < 0) { epd[y] = (byte) (d + 1); // n++; } } // System.out.println(d+1+" "+n); } for (int i = 1; i < 729; i++) eod[i] = -1; eod[0] = 0; // n = 1; for (int d = 0; d < 6; d++) { // nVisited = 0; for (int i = 0; i < 729; i++) if (eod[i] == d) { for (int k = 0; k < 3; k++) for (int y = i, m = 0; m < 3; m++) { y = eom[y][k]; if (eod[y] < 0) { eod[y] = (byte) (d + 1); // n++; } } } // System.out.println(d+1+" "+n); } ini = true; }