Beispiel #1
0
  /* Unpack a raw coord to a cube */
  private void unpack(EdgeCubies cube) {
    int ledge4of8 = raw_coord % 70;
    int edge = raw_coord / 70;
    int redge4of8 = edge % 70;
    edge /= 70;
    int perm6_fb = edge % 6;
    int perm6_rl = edge / 6;
    byte[] t = new byte[4];

    int i1 = 0;
    int i2 = 0;
    int r = 4;
    Util.set4Perm(t, perm6_rl);
    for (int i = 7; i >= 0; i--) {
      if (ledge4of8 >= Util.Cnk[i][r]) {
        ledge4of8 -= Util.Cnk[i][r--];
        cube.cubies[i + 4] = (byte) (t[i1++] + 4);
      } else cube.cubies[i + 4] = (byte) ((i2++) + 8);
    }

    i1 = 0;
    i2 = 0;
    r = 4;
    Util.set4Perm(t, perm6_fb);
    for (int i = 7; i >= 0; i--) {
      if (redge4of8 >= Util.Cnk[i][r]) {
        redge4of8 -= Util.Cnk[i][r--];
        cube.cubies[(i < 4) ? i : i + 8] = (byte) (i1++);
      } else cube.cubies[(i < 4) ? i : i + 8] = (byte) (t[i2++] + 12);
    }

    for (int i = 16; i < 24; i++) cube.cubies[i] = (byte) i;
  }