fork download
  1. // src: http://t...content-available-to-author-only...i.com/cubecontest/winners.html
  2. // By: Tomas Sirgedas, Ann Arbor, MI, USA
  3. // fix by noski , Pete Lomax
  4. #include <string.h>
  5. #include <iostream>
  6. using std :: string;
  7. using std :: cout;
  8. using std :: swap;
  9. using std :: endl;
  10. string data = "2#6'&78)5+1/AT[NJ_PERLQO@IAHPNSMBJCKLRMSDHEJNPOQFKGIQLSNF@DBROPMAGCEMPOACSRQDF";
  11. char inva[48], b[48], cur_phase, search_mode, history_idx, history_mov[48], history_rpt[48], depth_to_go[5<<20], hash_table[48][6912];
  12.  
  13. struct Cubelet {
  14. char pos, twi;
  15. } cubelet [48];
  16.  
  17. int min(unsigned int a, unsigned int b) {
  18. return a <b ? a : b;
  19. }
  20.  
  21. void rot(char cur_phase) {
  22. if (cur_phase <4) {
  23. for (int i = -1; ++i<4;) {
  24. cubelet[64^data[20+cur_phase*8+i]].twi = (cubelet[64^data[20+cur_phase*8+i]].twi+2-i%2) % 3;
  25. cubelet[64^data[20+cur_phase*8+i+4]].twi ^= cur_phase <2;
  26. }
  27. }
  28. for (int i = -1; ++i<7;) {
  29. swap(cubelet[64^data[20+cur_phase*8+i+(i!=3)]], cubelet[64^data[20+cur_phase*8+i]]);
  30. }
  31. }
  32.  
  33. int hashf() {
  34. int ret = 0;
  35. switch (cur_phase) {
  36. case 0:
  37. for (int i = -1; ++i<11;) {
  38. ret += ret + cubelet[i].twi;
  39. }
  40. return ret;
  41. case 1:
  42. for (int i = -1; ++i<7;) {
  43. ret = ret*3 + cubelet[i+12].twi;
  44. }
  45. for (int i = -1; ++i<11;) {
  46. ret += ret + (cubelet[i].pos>7);
  47. }
  48. return ret-7;
  49. case 2:
  50. for (int i = -1; ++i<8;) {
  51. if (cubelet[i+12].pos<16) {
  52. inva[cubelet[i+12].pos&3] = ret++;
  53. }
  54. else
  55. {
  56. b[i-ret] = cubelet[i+12].pos&3;
  57. }
  58. }
  59. for (int i = -1; ++i<7;) {
  60. ret += ret + (cubelet[i].pos>3);
  61. }
  62. for (int i = -1; ++i<7;) {
  63. ret += ret + (cubelet[i+12].pos>15);
  64. }
  65. return ret*54 + (inva[b[0]] ^ inva[b[1]])*2 + ((inva[b[0]] ^ inva [b[2]]) > (inva[b[0]] ^ inva[b[3]])) - 3587708;
  66. }
  67. for (int i = -1; ++i<5;) {
  68. ret *= 24;
  69. for (int cp = -1; ++cp<4;) {
  70. for (int k = -1; ++k<cp;) {
  71. if (cubelet[i*4+cp].pos < cubelet[i*4+k].pos) {
  72. //ret += cp << cp / 3;
  73. ret += cp + (cp==3?cp:0);
  74. }
  75. }
  76. }
  77. }
  78. return ret / 2;
  79. }
  80.  
  81. int do_search(int dpt) {
  82. int h = hashf(),
  83. q = (cur_phase/2*19+8)<<7;
  84. //if (dpt<1 && cur_phase==0) {
  85. // cout << "do_search(" << dpt << " (cp=" << (int)cur_phase << ")) " << h << " " << q << endl;
  86. //}
  87. if ((dpt < hash_table[cur_phase][h%q] | dpt < hash_table[cur_phase+4][h/q]) ^ search_mode) {
  88. if (search_mode) {
  89. if (dpt <= depth_to_go[h]) {
  90. return ! h;
  91. }
  92. else {
  93. depth_to_go[h] = dpt;
  94. }
  95. }
  96. if (hash_table[cur_phase][h%q] > dpt)
  97. hash_table[cur_phase][h%q] = dpt;
  98. if (hash_table[cur_phase+4][h/q] > dpt)
  99. hash_table[cur_phase+4][h/q] = dpt;
  100. for (int k = -1; ++k<6;) {
  101. for (int i = -1; ++i<4;) {
  102. rot(k);
  103. if (k < cur_phase*2 & i!=1 || i>2)
  104. continue;
  105. history_mov[history_idx] = k;
  106. history_rpt[history_idx++] = i;
  107. if (do_search(dpt-search_mode*2+1))
  108. return 1;
  109. history_idx--;
  110. }
  111. }
  112. }
  113. return 0;
  114. }
  115.  
  116. /*
  117. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DRF", "DFL", "DLB", "DBR", NULL}; // (solved)
  118. const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "UF", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "URB", "UBL", "ULF", "UFR", "DRF", "DFL", "DLB", "DBR", NULL};
  119. const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "UR", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "UBL", "ULF", "UFR", "URB", "DRF", "DFL", "DLB", "DBR", NULL};
  120. const char *argv[] = {"rubik.exe", "UL", "UF", "UR", "UB", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "ULF", "UFR", "URB", "UBL", "DRF", "DFL", "DLB", "DBR", NULL};
  121. */
  122. /*
  123. const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "RF", "DR", "DB", "DL", "FU", "FD", "BR", "BL", "LFU", "URB", "UBL", "LDF", "RUF", "RFD", "DLB", "DBR", NULL};
  124. const char *argv[] = {"rubik.exe", "DF", "UR", "UB", "UL", "UF", "DR", "DB", "DL", "FL", "FR", "BR", "BL", "DFL", "URB", "UBL", "DRF", "ULF", "UFR", "DLB", "DBR", NULL};
  125. const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "LF", "DR", "DB", "DL", "FD", "FU", "BR", "BL", "RFD", "URB", "UBL", "RUF", "LDF", "LFU", "DLB", "DBR", NULL};
  126. const char *argv[] = {"rubik.exe", "UF", "FR", "UB", "UL", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "FDR", "FRU", "UBL", "ULF", "BRD", "DFL", "DLB", "BUR", NULL};
  127. const char *argv[] = {"rubik.exe", "UF", "DR", "UB", "UL", "DF", "UR", "DB", "DL", "BR", "FL", "FR", "BL", "DBR", "DRF", "UBL", "ULF", "URB", "DFL", "DLB", "UFR", NULL};
  128. const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "UL", "DF", "FR", "DB", "DL", "UR", "FL", "DR", "BL", "BUR", "BRD", "UBL", "ULF", "FRU", "DFL", "DLB", "FDR", NULL};
  129. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DL", "DF", "DR", "DB", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DFL", "DLB", "DBR", "DRF", NULL};
  130. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DB", "DL", "DF", "DR", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DLB", "DBR", "DRF", "DFL", NULL};
  131. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DR", "DB", "DL", "DF", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DBR", "DRF", "DFL", "DLB", NULL};
  132. const char *argv[] = {"rubik.exe", "UF", "UR", "RB", "UL", "DF", "DR", "LB", "DL", "FR", "FL", "BD", "BU", "UFR", "RDB", "RBU", "ULF", "DRF", "DFL", "LUB", "LBD", NULL};
  133. const char *argv[] = {"rubik.exe", "UF", "UR", "DB", "UL", "DF", "DR", "UB", "DL", "FR", "FL", "BL", "BR", "UFR", "DLB", "DBR", "ULF", "DRF", "DFL", "URB", "UBL", NULL};
  134. const char *argv[] = {"rubik.exe", "UF", "UR", "LB", "UL", "DF", "DR", "RB", "DL", "FR", "FL", "BU", "BD", "UFR", "LUB", "LBD", "ULF", "DRF", "DFL", "RDB", "RBU", NULL};
  135. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "DF", "DR", "DB", "FL", "FR", "UL", "BR", "DL", "UFR", "URB", "BDL", "BLU", "DRF", "FUL", "FLD", "DBR", NULL};
  136. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "DL", "DF", "DR", "DB", "UL", "FR", "BL", "BR", "FL", "UFR", "URB", "DFL", "DLB", "DRF", "UBL", "ULF", "DBR", NULL};
  137. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "FL", "DF", "DR", "DB", "BL", "FR", "DL", "BR", "UL", "UFR", "URB", "FUL", "FLD", "DRF", "BDL", "BLU", "DBR", NULL};
  138. const char *argv[] = {"rubik.exe", "LB", "UL", "UF", "UR", "DF", "DR", "RB", "DL", "FR", "FL", "BU", "BD", "LBD", "ULF", "UFR", "LUB", "DRF", "DFL", "RDB", "RBU", NULL};
  139. const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "DL", "DF", "DR", "DB", "UF", "FR", "BL", "BR", "FL", "URB", "UBL", "DFL", "DLB", "DRF", "ULF", "UFR", "DBR", NULL};
  140. const char *argv[] = {"rubik.exe", "UL", "BR", "UR", "UB", "DF", "FR", "DB", "DL", "UF", "FL", "DR", "BL", "RUF", "BRD", "URB", "UBL", "LFU", "DFL", "DLB", "FDR", NULL};
  141. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "FL", "DF", "DR", "DB", "FR", "UL", "BR", "DL", "UFR", "URB", "BDL", "BLU", "FUL", "FLD", "DBR", "DRF", NULL};
  142. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "DL", "UL", "DF", "DR", "DB", "FR", "BL", "BR", "FL", "UFR", "URB", "DFL", "DLB", "UBL", "ULF", "DBR", "DRF", NULL};
  143. const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "DB", "DL", "LF", "DR", "FD", "FU", "BR", "BL", "RFD", "URB", "UBL", "RUF", "DLB", "DBR", "LDF", "LFU", NULL};
  144. const char *argv[] = {"rubik.exe", "LF", "DR", "UB", "UL", "RF", "UR", "DB", "DL", "BR", "FD", "FU", "BL", "DBR", "RUF", "UBL", "LDF", "URB", "RFD", "DLB", "LFU", NULL};
  145. const char *argv[] = {"rubik.exe", "DF", "FL", "UB", "UL", "UF", "BR", "DB", "DL", "DR", "FR", "UR", "BL", "FUL", "FLD", "UBL", "DRF", "BRD", "UFR", "DLB", "BUR", NULL};
  146. const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "UR", "DL", "DF", "DR", "DB", "FR", "FL", "BR", "BL", "UBL", "ULF", "UFR", "URB", "DFL", "DLB", "DBR", "DRF", NULL};
  147. const char *argv[] = {"rubik.exe", "UF", "DR", "UB", "BL", "DF", "UR", "DB", "FL", "BR", "UL", "FR", "DL", "DBR", "DRF", "BDL", "BLU", "URB", "FUL", "FLD", "UFR", NULL};
  148. const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "DL", "DF", "DR", "FL", "FR", "UL", "BR", "DB", "UFR", "URB", "RDB", "BLU", "DFL", "FUL", "LBD", "DRF", NULL};
  149. const char *argv[] = {"rubik.exe", "DF", "UR", "UB", "UL", "DR", "DB", "DL", "UF", "FL", "FR", "BR", "BL", "DFL", "URB", "UBL", "DRF", "DBR", "ULF", "UFR", "DLB", NULL};
  150. const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "FR", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "UBL", "ULF", "FDR", "FRU", "BRD", "DFL", "DLB", "BUR", NULL};
  151. const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "BL", "DF", "DR", "DB", "FL", "FR", "UF", "BR", "DL", "URB", "UBL", "BDL", "LFU", "DRF", "RUF", "FLD", "DBR", NULL};
  152. const char *argv[] = {"rubik.exe", "UL", "UF", "DR", "UB", "DF", "UR", "DB", "DL", "BR", "FL", "FR", "BL", "ULF", "DBR", "DRF", "UBL", "URB", "DFL", "DLB", "UFR", NULL};
  153. const char *argv[] = {"rubik.exe", "UL", "UF", "FR", "UB", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "ULF", "FDR", "FRU", "UBL", "BRD", "DFL", "DLB", "BUR", NULL};
  154. const char *argv[] = {"rubik.exe", "RF", "UL", "UF", "UR", "LF", "DR", "DB", "DL", "FD", "BU", "BR", "BL", "RFD", "ULF", "UFR", "LUB", "LDF", "RBU", "DLB", "DBR", NULL};
  155. const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "BR", "DF", "FR", "DB", "DL", "UR", "FL", "DR", "BL", "UBL", "ULF", "BUR", "BRD", "FRU", "DFL", "DLB", "FDR", NULL};
  156. const char *argv[] = {"rubik.exe", "DR", "UR", "UB", "UL", "LF", "DB", "DL", "RF", "FD", "FU", "BR", "BL", "RUF", "URB", "UBL", "DBR", "LDF", "LFU", "RFD", "DLB", NULL};
  157. const char *argv[] = {"rubik.exe", "DR", "UL", "UF", "UR", "UB", "DB", "DL", "DF", "FL", "FR", "BR", "BL", "DRF", "ULF", "UFR", "DBR", "URB", "UBL", "DFL", "DLB", NULL};
  158. const char *argv[] = {"rubik.exe", "UF", "FR", "UB", "BL", "DB", "DL", "DF", "FL", "DR", "UL", "UR", "BR", "FDR", "FRU", "DBR", "BLU", "DLB", "FUL", "URB", "DFL", NULL};
  159. const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "UL", "DR", "DB", "DL", "FR", "UR", "FL", "DF", "BL", "BUR", "RFD", "UBL", "ULF", "DBR", "LDF", "FRU", "DLB", NULL};
  160. const char *argv[] = {"rubik.exe", "RD", "FR", "DB", "UL", "LF", "BL", "UB", "DL", "FD", "FU", "UR", "BR", "LUB", "FRU", "DBR", "RFD", "LDF", "LFU", "URB", "BDL", NULL};
  161. const char *argv[] = {"rubik.exe", "DF", "UR", "DB", "FR", "UF", "DR", "UB", "BR", "FL", "DL", "BL", "UL", "DFL", "DLB", "FDR", "FRU", "ULF", "BUR", "BRD", "UBL", NULL};
  162. const char *argv[] = {"rubik.exe", "UL", "UF", "DR", "LB", "DF", "UR", "RB", "DL", "BU", "FL", "FR", "BD", "ULF", "RBU", "DRF", "LBD", "LUB", "DFL", "RDB", "UFR", NULL};
  163. const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "RB", "DR", "DB", "DL", "FR", "FD", "FU", "BL", "UFR", "RDB", "UBL", "LDF", "DRF", "RBU", "DLB", "LFU", NULL};
  164. const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "DB", "DL", "DF", "FR", "UL", "UR", "BL", "DR", "FL", "BUR", "BRD", "DLB", "FDR", "DFL", "UBL", "ULF", "FRU", NULL};
  165. const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "LB", "DR", "DB", "DL", "FD", "FL", "BR", "FU", "RFD", "URB", "LBD", "ULF", "LUB", "DFL", "RUF", "DBR", NULL};
  166. const char *argv[] = {"rubik.exe", "LF", "BU", "LB", "UL", "RU", "FR", "RB", "DL", "FU", "FD", "DR", "BD", "LFU", "BUR", "LBD", "LDF", "UBL", "RUF", "RDB", "FDR", NULL};
  167. const char *argv[] = {"rubik.exe", "DR", "UB", "UL", "BL", "DF", "UR", "DB", "FL", "BR", "UF", "FR", "DL", "DRF", "UBL", "BDL", "LFU", "URB", "RDB", "FLD", "UFR", NULL};
  168. const char *argv[] = {"rubik.exe", "UF", "BR", "LB", "BD", "DF", "FR", "RD", "FL", "UR", "UL", "BU", "DL", "BUR", "LUB", "DRF", "BDL", "FRU", "FUL", "FLD", "RDB", NULL};
  169. const char *argv[] = {"rubik.exe", "UL", "UF", "DB", "UB", "DF", "FR", "BR", "DL", "UR", "FL", "BL", "DR", "ULF", "DLB", "FDR", "UBL", "FRU", "DFL", "BUR", "BRD", NULL};
  170. const char *argv[] = {"rubik.exe", "UF", "UR", "RB", "BU", "DF", "DR", "LF", "BL", "FR", "DL", "BD", "UL", "UFR", "RDB", "FLD", "BUR", "DRF", "BDL", "BLU", "LFU", NULL};
  171. const char *argv[] = {"rubik.exe", "UF", "UR", "DB", "FL", "DR", "UB", "BL", "DF", "FR", "DL", "UL", "BR", "UFR", "BLU", "DBR", "FLD", "FUL", "DRF", "BDL", "URB", NULL};
  172. const char *argv[] = {"rubik.exe", "DF", "BR", "RD", "UL", "UF", "FL", "LB", "DL", "UR", "FR", "BD", "BU", "BUR", "LFU", "RDB", "DRF", "FLD", "UFR", "LUB", "LBD", NULL};
  173. const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "DF", "DR", "DB", "RF", "FU", "LD", "BR", "BL", "LFU", "URB", "UBL", "BDL", "DRF", "RUF", "FLD", "DBR", NULL};
  174. const char *argv[] = {"rubik.exe", "RU", "LF", "BL", "FR", "BR", "DB", "FD", "LD", "DR", "FU", "UB", "LU", "LDF", "BLU", "FRU", "DBR", "LBD", "DRF", "ULF", "RBU", NULL};
  175. const char *argv[] = {"rubik.exe", "UF", "BD", "BL", "FL", "RB", "UB", "DR", "UL", "RF", "RU", "FD", "LD", "LDF", "LBD", "RUF", "FDR", "DBR", "LFU", "BUR", "LUB", NULL};
  176. const char *argv[] = {"rubik.exe", "DF", "FU", "DB", "BL", "LF", "LU", "DR", "UR", "FR", "LD", "BR", "UB", "DFL", "ULF", "UFR", "BRD", "LUB", "DRF", "BUR", "LBD", NULL};
  177. const char *argv[] = {"rubik.exe", "LU", "UB", "DR", "FR", "UF", "FL", "DL", "DF", "BD", "LB", "RU", "BR", "FUL", "BLU", "FRU", "DLB", "URB", "BRD", "RFD", "DFL", NULL};
  178. const char *argv[] = {"rubik.exe", "RF", "RB", "LU", "FD", "FU", "FL", "LD", "RD", "DB", "UR", "BL", "BU", "RFD", "RUF", "LDF", "LUB", "ULF", "URB", "LBD", "BRD", NULL};
  179. const char *argv[] = {"rubik.exe", "FL", "LU", "RU", "DL", "FU", "FR", "RD", "UB", "RB", "DB", "FD", "BL", "ULF", "RFD", "BDL", "FLD", "BUR", "FRU", "BRD", "BLU", NULL};
  180. const char *argv[] = {"rubik.exe", "LU", "FD", "FL", "FU", "DR", "BD", "UB", "LB", "RB", "DL", "UR", "FR", "LBD", "UFR", "RFD", "BLU", "BUR", "ULF", "FLD", "DBR", NULL};
  181. const char *argv[] = {"rubik.exe", "LB", "RB", "FU", "DF", "UB", "DB", "DL", "UR", "FR", "LF", "UL", "DR", "BDL", "UBL", "RUF", "FLD", "RDB", "ULF", "URB", "FDR", NULL};
  182. const char *argv[] = {"rubik.exe", "FD", "FL", "UF", "UL", "UR", "DB", "DR", "BU", "BR", "FR", "LB", "LD", "DLB", "UFR", "LUB", "FUL", "BUR", "DRF", "BRD", "LDF", NULL};
  183. const char *argv[] = {"rubik.exe", "UB", "UR", "UL", "DF", "DB", "LD", "RF", "BR", "LF", "RD", "BL", "UF", "BLU", "FDR", "BDL", "FUL", "RUF", "BRD", "DFL", "BUR", NULL};
  184. const char *argv[] = {"rubik.exe", "LF", "UB", "UF", "DF", "UR", "DB", "RB", "UL", "RD", "RF", "LB", "LD", "BDL", "BRD", "LDF", "UFR", "BUR", "UBL", "LFU", "RFD", NULL};
  185. const char *argv[] = {"rubik.exe", "DF", "FR", "UB", "BD", "FU", "BL", "RU", "BR", "RD", "DL", "LU", "LF", "DBR", "RUF", "BDL", "UBL", "RFD", "FLD", "BUR", "LFU", NULL};
  186. const char *argv[] = {"rubik.exe", "FU", "FR", "RU", "LU", "LD", "BL", "FL", "RB", "UB", "BD", "RD", "FD", "FDR", "FUL", "FRU", "BDL", "LUB", "RDB", "URB", "FLD", NULL};
  187. const char *argv[] = {"rubik.exe", "LD", "DF", "FR", "BR", "UF", "RU", "UB", "FL", "RD", "LB", "UL", "DB", "LDF", "BRD", "FRU", "LFU", "BDL", "RFD", "BUR", "LUB", NULL};
  188. const char *argv[] = {"rubik.exe", "BD", "BU", "RU", "DL", "DF", "BL", "FR", "FL", "LU", "DR", "BR", "UF", "LDF", "LBD", "URB", "FUL", "BRD", "RUF", "UBL", "RFD", NULL};
  189. const char *argv[] = {"rubik.exe", "FR", "LU", "BU", "DL", "BD", "UF", "UR", "BL", "FL", "FD", "BR", "DR", "RFD", "RUF", "BRD", "DFL", "LFU", "LBD", "UBL", "URB", NULL};
  190. const char *argv[] = {"rubik.exe", "LU", "FU", "RU", "DF", "LB", "RB", "DL", "BD", "LF", "RD", "RF", "BU", "BRD", "DFL", "RBU", "LUB", "DLB", "LFU", "FDR", "RUF", NULL};
  191. const char *argv[] = {"rubik.exe", "UB", "DF", "BD", "UF", "LB", "LF", "LU", "UR", "LD", "RD", "BR", "FR", "RBU", "LBD", "FDR", "UBL", "LFU", "DBR", "LDF", "RUF", NULL};
  192. const char *argv[] = {"rubik.exe", "RB", "UB", "RF", "LF", "UF", "RD", "BL", "DL", "RU", "DF", "DB", "LU", "RFD", "LFU", "LDF", "RUF", "UBL", "RDB", "LBD", "URB", NULL};
  193. const char *argv[] = {"rubik.exe", "FR", "LB", "FD", "FU", "DR", "BR", "LU", "BD", "UR", "BU", "LF", "LD", "LUB", "LFU", "BDL", "DBR", "DRF", "RBU", "FLD", "RUF", NULL};
  194. const char *argv[] = {"rubik.exe", "UL", "DL", "RF", "UB", "FD", "BR", "DB", "UF", "DR", "UR", "BL", "FL", "FDR", "BLU", "DLB", "URB", "RUF", "FLD", "BRD", "FUL", NULL};
  195. const char *argv[] = {"rubik.exe", "RU", "BU", "FL", "RD", "BD", "FR", "LU", "FD", "FU", "DL", "BL", "RB", "RUF", "DFL", "UBL", "ULF", "URB", "BDL", "DBR", "FDR", NULL};
  196. const char *argv[] = {"rubik.exe", "RF", "DL", "BL", "LF", "DB", "BR", "FD", "BU", "RD", "FU", "RU", "LU", "URB", "LUB", "RFD", "DFL", "FRU", "BDL", "DBR", "ULF", NULL};
  197. const char *argv[] = {"rubik.exe", "RU", "FL", "FR", "FU", "DL", "RD", "UB", "BD", "UL", "FD", "BL", "RB", "BDL", "BRD", "UFR", "FDR", "BLU", "RBU", "FLD", "LFU", NULL};
  198. const char *argv[] = {"rubik.exe", "RF", "FU", "BU", "FL", "UL", "LD", "RB", "DB", "BL", "FD", "RU", "RD", "BRD", "RUF", "DLB", "UBL", "DFL", "LFU", "URB", "FDR", NULL};
  199. const char *argv[] = {"rubik.exe", "FR", "RU", "UF", "LF", "BD", "LU", "BU", "DL", "RB", "FD", "LB", "DR", "FLD", "RUF", "BLU", "RFD", "DBR", "LFU", "LBD", "BUR", NULL};
  200. const char *argv[] = {"rubik.exe", "FL", "RD", "BR", "UB", "UR", "DF", "BL", "UL", "FU", "BD", "DL", "RF", "ULF", "UBL", "FRU", "URB", "DRF", "BRD", "FLD", "DLB", NULL};
  201. const char *argv[] = {"rubik.exe", "BR", "LU", "UB", "BL", "FR", "RD", "FL", "FD", "BD", "UF", "UR", "DL", "DBR", "BUR", "FLD", "LUB", "RFD", "FRU", "ULF", "BDL", NULL};
  202. const char *argv[] = {"rubik.exe", "UL", "DF", "LB", "RU", "BR", "UF", "BD", "LD", "LF", "BU", "DR", "FR", "FRU", "BUR", "LDF", "DRF", "UBL", "RDB", "BDL", "ULF", NULL};
  203. const char *argv[] = {"rubik.exe", "UB", "FR", "LU", "RD", "RU", "UF", "LF", "RB", "LB", "DF", "LD", "BD", "RFD", "BDL", "ULF", "LUB", "LDF", "BUR", "RUF", "BRD", NULL};
  204. const char *argv[] = {"rubik.exe", "BR", "FD", "UF", "LB", "UL", "UB", "RF", "DR", "FL", "RU", "LD", "BD", "UBL", "ULF", "RUF", "FLD", "BDL", "RDB", "BUR", "DRF", NULL};
  205. const char *argv[] = {"rubik.exe", "RU", "FR", "LB", "DL", "BD", "DF", "LF", "BR", "UF", "UL", "DR", "UB", "DFL", "BLU", "BRD", "UFR", "LBD", "ULF", "FDR", "RBU", NULL};
  206. const char *argv[] = {"rubik.exe", "LD", "LU", "DF", "LB", "UR", "FL", "DR", "BR", "FR", "UF", "UB", "BD", "DFL", "DRF", "LUB", "LFU", "DLB", "RUF", "DBR", "RBU", NULL};
  207. const char *argv[] = {"rubik.exe", "LB", "DB", "RU", "DF", "LU", "BU", "RF", "RB", "UF", "RD", "DL", "LF", "DLB", "LFU", "FLD", "RDB", "FDR", "BLU", "BUR", "UFR", NULL};
  208. const char *argv[] = {"rubik.exe", "DR", "DB", "BU", "DL", "BL", "DF", "BR", "FL", "UL", "UR", "FR", "FU", "ULF", "UFR", "DBR", "DFL", "BLU", "BUR", "BDL", "RFD", NULL};
  209. const char *argv[] = {"rubik.exe", "DB", "DL", "DF", "UF", "UB", "FR", "LB", "DR", "UL", "LF", "UR", "BR", "DRF", "LDF", "UFR", "BRD", "DLB", "RBU", "UBL", "FUL", NULL};
  210. const char *argv[] = {"rubik.exe", "BL", "DF", "UL", "RB", "BD", "UR", "UB", "FL", "LD", "DR", "RF", "UF", "URB", "LBD", "LFU", "RFD", "BRD", "BLU", "FRU", "DFL", NULL};
  211. const char *argv[] = {"rubik.exe", "UL", "DR", "BU", "BL", "DF", "LD", "BR", "DB", "LF", "RF", "FU", "RU", "BLU", "URB", "LBD", "FDR", "DFL", "DBR", "LFU", "FRU", NULL};
  212. const char *argv[] = {"rubik.exe", "UR", "BL", "DB", "RB", "FL", "UB", "DL", "UF", "DF", "RF", "RD", "LU", "DFL", "BLU", "FDR", "LBD", "BUR", "UFR", "LFU", "RDB", NULL};
  213. const char *argv[] = {"rubik.exe", "DL", "LU", "FU", "BD", "RD", "FR", "RB", "BL", "FD", "UR", "FL", "UB", "BDL", "FLD", "ULF", "RBU", "FRU", "RDB", "BLU", "RFD", NULL};
  214. const char *argv[] = {"rubik.exe", "UB", "FU", "LU", "DL", "RB", "DB", "LB", "RF", "FD", "RU", "LF", "DR", "FRU", "DRF", "BLU", "BUR", "BRD", "DLB", "FLD", "ULF", NULL};
  215. const char *argv[] = {"rubik.exe", "UR", "FU", "DL", "UL", "BL", "LF", "FD", "UB", "RB", "FR", "DR", "DB", "UFR", "BLU", "BUR", "FLD", "DLB", "LFU", "RFD", "DBR", NULL};
  216. const char *argv[] = {"rubik.exe", "RB", "UF", "DF", "FR", "DL", "DR", "UL", "UR", "UB", "BL", "FL", "BD", "FLD", "RDB", "BLU", "BUR", "RUF", "RFD", "LBD", "FUL", NULL};
  217. const char *argv[] = {"rubik.exe", "BD", "LU", "UB", "DL", "DR", "BL", "RF", "DF", "BR", "UF", "LF", "UR", "FLD", "LUB", "RUF", "LBD", "RDB", "ULF", "DRF", "RBU", NULL};
  218. const char *argv[] = {"rubik.exe", "RU", "LF", "RD", "RF", "FU", "UL", "BD", "DF", "RB", "LB", "BU", "LD", "LBD", "URB", "LUB", "DRF", "ULF", "FLD", "RDB", "UFR", NULL};
  219. */
  220. const char *argv[] = {"rubik.exe", "UL", "DB", "BR", "FL", "BL", "DR", "FD", "RU", "FR", "UB", "LD", "FU", "FDR", "FUL", "BDL", "RBU", "FLD", "RUF", "DBR", "LUB", NULL};
  221. /*
  222. */
  223. int argc = sizeof(argv) / sizeof(char*) - 1;
  224. int main () {
  225. if (argc != 21) {
  226. cout << endl
  227. << "### Input Error. Argument Format:" << endl
  228. << argc << endl
  229. << argv << endl
  230. << "rubik.exe UF UR UB UL DF DR DB DL FR FR BR BR UFR URB UBL ULF DRF DFL DLB DBR" << endl;
  231. return 0;
  232. }
  233. memset(hash_table, 6, sizeof(hash_table));
  234. for (int i = -1; ++i<20;) {
  235. cubelet[i].pos = i;
  236. }
  237. for (cur_phase = -1; ++cur_phase<4;) {
  238. do_search(0);
  239. }
  240. for (int i = -1; ++i<20;) {
  241. string s = argv [i + 1] + string ("!");
  242. cubelet[i].pos = data.find(s[0] ^ s[1] ^ s[2]);
  243. int x = min(s.find('U'), s.find('D'));
  244. cubelet[i].twi = ~ x? x: s[0]>'F';
  245. //cout << "cubelet(" << i << ") = {" << (int)cubelet[i].pos << "," << (int)cubelet[i].twi << "}" << endl;
  246. }
  247. for (int i = -1; ++i<5;) {
  248. int j = 64^data[20+cur_phase*8+i+16],
  249. k = 64^data[20+cur_phase*8+i+21];
  250. swap(cubelet[j], cubelet[k]);
  251. //cout << "swap(" << j << "," << k << ")" << endl;
  252. }
  253. // for (int i = -1; ++i<20;) {
  254. //cout << "cubelet(" << i << ") = {" << (int)cubelet[i].pos << "," << (int)cubelet[i].twi << "}" << endl;
  255. // }
  256.  
  257. search_mode = 1;
  258. for (cur_phase = -1; ++cur_phase<4;) {
  259. // cout << (int)cur_phase << endl;
  260. for (int i = -1; ++i<20;) {
  261. // cout << (int)cur_phase << ",i=" << i << endl;
  262. if (do_search (i)) break ;
  263. }
  264. }
  265. cout << "soluton (" << (int)history_idx << " moves)" << endl;
  266. for (int k = -1; ++k<history_idx;) {
  267. cout << "FBRLUD"[history_mov[k]] << history_rpt[k]+1 << "";
  268. }
  269. cout << endl;
  270. return 0;
  271. }
  272.  
Success #stdin #stdout 0.02s 21512KB
stdin
Standard input is empty
stdout
soluton (33 moves)
B2D3B1B2U2B2D3L3D1R1U2L1U3B2U1B2U2L2U3B2U1R2F2U2F2D2F2D2R2U2F2L2B2