Пример #1
0
 static int getMi(int ep) {
   int[] arr = new int[7];
   Im.set7Perm(arr, ep);
   for (int i = 0; i < 3; i++) {
     if (arr[i + 1] < 4) arr[i] = arr[i + 1];
     else arr[i] = 6 - arr[i + 1];
   }
   return Im.permToIdx(arr, 3);
 }
Пример #2
0
  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;
  }