73 #include "../common/mesh_extras.hpp"
81 using namespace mfem::common;
84 static int nstep_ = 6;
85 static int count_ = 0;
86 static int logging_ = 0;
88 static double cosa_ = cos(0.5 * M_PI / nstep_);
89 static double sina_ = sin(0.5 * M_PI / nstep_);
112 static RubikState rubik;
114 static int edge_colors_[24] =
121 static int corn_colors_[24] =
123 4,1,0, 2,1,0, 2,3,0, 4,3,0,
124 4,1,5, 2,1,5, 2,3,5, 4,3,5
150 void anim_move(
char axis,
int tier,
int increment,
158 anim_move(move.axis, move.tier, move.incr, mesh, color, sock);
164 int * c0 = NULL,
int * c1 = NULL);
167 bool cw,
int * c0 = NULL,
int * c1 = NULL,
int * c2 = NULL);
170 int * e0,
int * e1,
int * e2);
176 int n,
int * e0 = NULL,
int * e1 = NULL,
177 int * e2 = NULL,
int * e3 = NULL);
187 int main(
int argc,
char *argv[])
190 bool visualization =
true;
193 args.
AddOption(&anim,
"-anim",
"--animation",
"-no-anim",
195 "Enable or disable GLVis animation.");
196 args.
AddOption(&logging_,
"-l",
"--log-level",
197 "Control the amount of logging information.");
198 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
199 "--no-visualization",
200 "Enable or disable GLVis visualization.");
211 if (!visualization) { anim =
false; }
216 Mesh mesh(3, 16 * 27, 27 * 6);
226 for (
int i=1; i<=7; i++) { pwCoef(i) = (double)(i-1)/6.0; }
232 oss <<
"rubik-init.mesh";
233 ofstream ofs(oss.str().c_str());
242 char vishost[] =
"localhost";
246 sock <<
"solution\n" << mesh << color <<
"keys Amaa\n"
247 <<
"palette 25\n" <<
"autoscale off\n" << flush;
253 cout <<
"Enter axis (x, y, z), tier index (1, 2, 3), "
254 <<
"and rotation (0, 1, 2, 3) with no spaces: ";
256 if ( axis ==
'x' || axis ==
'y' || axis ==
'z' )
261 if (tier >= 1 && tier <= 3)
263 anim_move(axis, tier, incr, mesh, color, sock);
267 cout <<
"tier index must be 1, 2, or 3." << endl;
270 else if ( axis ==
'r' )
278 for (
int i=0; i<num; i++)
283 else if ( axis ==
'p' )
287 else if ( axis ==
'c' )
291 else if ( axis ==
't' )
297 else if ( axis ==
'e' )
303 else if ( axis ==
'f' )
307 if (n == 2 || n == 4)
313 cout <<
"Can only flip 2 or 4 edges at a time." << endl;
316 else if ( axis ==
'R' )
320 else if ( axis ==
'T' )
324 else if ( axis ==
'M' )
328 else if ( axis ==
'B' )
332 else if ( axis ==
's' || axis ==
'S')
334 solve(mesh, color, sock);
336 else if ( axis ==
'h' || axis ==
'H')
340 else if ( axis ==
'q' || axis ==
'Q')
346 cout << endl <<
"Unrecognized command. "
347 "Enter 'x', 'y', 'z' followed by '1', '2', or '3' to proceed "
348 "or enter 'q' to quit: ";
362 cout <<
"\nInteractive Commands\n"
363 <<
" [xyz][1,2,3][0-3]\n"
364 <<
"\tRotate the specified tier (first integer) of the cube\n"
365 <<
"\tabout the given axis (initial character) in the clockwise\n"
366 <<
"\tdirection (looking from the tip of the axis vector towards\n"
367 <<
"\tthe origin) by so many increments (final integer).\n"
369 <<
"\tInitiate a random sequence of moves. The integer\n"
370 <<
"\tfollowing 'r' is the number of desired moves.\n"
372 <<
"\tPrint the current state of the cube.\n"
374 <<
"\tSwap the corners in the 0th and 1st positions.\n"
376 <<
"\tTwist the corners of the bottom tier in the clockwise '1'\n"
377 <<
"\tor counter-clockwise '0' direction leaving the 3rd corner\n"
380 <<
"\tPermute the edges of the bottom tier in the clockwise '1'\n"
381 <<
"\tor counter-clockwise '0' direction leaving the 3rd edge\n"
384 <<
"\tFlip the edges of the bottom tier while keeping them in\n"
385 <<
"\tplace. The integer '2' indicates flipping the 0th and 2nd\n"
386 <<
"\tedges while '4' indicates flipping all four edges.\n"
388 <<
"\tResets (or Repaints) the cube to its original configuration.\n"
390 <<
"\tSolve the top tier only.\n"
392 <<
"\tSolve the middle tier only (assumes the top tier has already\n"
393 <<
"\tbeen solved.)\n"
395 <<
"\tSolve the bottom tier only (assumes the top two tiers have\n"
396 <<
"\talready been solved.)\n"
398 <<
"\tSolve the cube starting from the top tier and working down.\n"
400 <<
"\tPrint this message.\n"
413 for (
int k=0; k<3; k++)
415 for (
int j=0; j<3; j++)
417 for (
int i=0; i<3; i++)
467 c[0] = -1.5 + i + 0.25;
468 c[1] = -1.5 + j + 0.25;
469 c[2] = -1.5 + k + 0.25;
473 c[0] = -1.5 + i + 0.75;
474 c[1] = -1.5 + j + 0.25;
475 c[2] = -1.5 + k + 0.25;
479 c[0] = -1.5 + i + 0.75;
480 c[1] = -1.5 + j + 0.75;
481 c[2] = -1.5 + k + 0.25;
485 c[0] = -1.5 + i + 0.25;
486 c[1] = -1.5 + j + 0.75;
487 c[2] = -1.5 + k + 0.25;
491 c[0] = -1.5 + i + 0.25;
492 c[1] = -1.5 + j + 0.25;
493 c[2] = -1.5 + k + 0.75;
497 c[0] = -1.5 + i + 0.75;
498 c[1] = -1.5 + j + 0.25;
499 c[2] = -1.5 + k + 0.75;
503 c[0] = -1.5 + i + 0.75;
504 c[1] = -1.5 + j + 0.75;
505 c[2] = -1.5 + k + 0.75;
509 c[0] = -1.5 + i + 0.25;
510 c[1] = -1.5 + j + 0.75;
511 c[2] = -1.5 + k + 0.75;
516 vh[0] = v[ 0]; vh[1] = v[ 1]; vh[2] = v[ 2]; vh[3] = v[ 3];
517 vh[4] = v[ 8]; vh[5] = v[ 9]; vh[6] = v[10]; vh[7] = v[11];
518 mesh.
AddHex(vh, k==0 ? 6 : 1);
521 vh[0] = v[12]; vh[1] = v[13]; vh[2] = v[14]; vh[3] = v[15];
522 vh[4] = v[ 4]; vh[5] = v[ 5]; vh[6] = v[ 6]; vh[7] = v[ 7];
523 mesh.
AddHex(vh, k==2 ? 7 : 1);
526 vh[0] = v[ 0]; vh[1] = v[ 4]; vh[2] = v[ 5]; vh[3] = v[ 1];
527 vh[4] = v[ 8]; vh[5] = v[12]; vh[6] = v[13]; vh[7] = v[ 9];
528 mesh.
AddHex(vh, j==0 ? 4 : 1);
531 vh[0] = v[11]; vh[1] = v[15]; vh[2] = v[14]; vh[3] = v[10];
532 vh[4] = v[ 3]; vh[5] = v[ 7]; vh[6] = v[ 6]; vh[7] = v[ 2];
533 mesh.
AddHex(vh, j==2 ? 5 : 1);
536 vh[0] = v[ 0]; vh[1] = v[ 3]; vh[2] = v[ 7]; vh[3] = v[ 4];
537 vh[4] = v[ 8]; vh[5] = v[11]; vh[6] = v[15]; vh[7] = v[12];
538 mesh.
AddHex(vh, i==0 ? 3 : 1);
541 vh[0] = v[ 9]; vh[1] = v[10]; vh[2] = v[14]; vh[3] = v[13];
542 vh[4] = v[ 1]; vh[5] = v[ 2]; vh[6] = v[ 6]; vh[7] = v[ 5];
543 mesh.
AddHex(vh, i==2 ? 2 : 1);
554 for (
int i=0; i<6; i++) { rubik.cent_[i] = i; }
555 for (
int i=0; i<24; i++) { rubik.edge_[i] = edge_colors_[i]; }
556 for (
int i=0; i<24; i++) { rubik.corn_[i] = corn_colors_[i]; }
562 int i = (axis ==
'x') ? 0 : ((axis ==
'y') ? 1 : 2);
563 int i0 = 0 + i * (i - 1) / 2;
564 int i1 = 1 + i * (i + 1) / 2;
565 int i3 = 3 - i * (3 * i - 5) / 2;
566 int i5 = 5 - i * (i - 1);
571 std::swap(rubik.cent_[i3], rubik.cent_[i0]);
572 std::swap(rubik.cent_[i5], rubik.cent_[i3]);
573 std::swap(rubik.cent_[i1], rubik.cent_[i5]);
576 std::swap(rubik.cent_[i0], rubik.cent_[i5]);
577 std::swap(rubik.cent_[i1], rubik.cent_[i3]);
580 std::swap(rubik.cent_[i1], rubik.cent_[i0]);
581 std::swap(rubik.cent_[i5], rubik.cent_[i1]);
582 std::swap(rubik.cent_[i3], rubik.cent_[i5]);
590 if (tier == 2) {
return; }
592 int i = (axis ==
'x') ? 0 : ((axis ==
'y') ? 1 : 2);
601 int i09 = 9 - i * ( 6 * i - 10);
602 int i21 = 21 - i * ( 3 * i + 7) / 2;
603 int i12 = 12 + i * (15 * i - 31) / 2;
605 int i01 = 1 - i * ( 3 * i - 5) / 2;
606 int i10 = 10 - i * (15 * i - 23) / 2;
607 int i22 = 22 - i * ( 3 * i + 2);
608 int i13 = 13 + i * ( 6 * i - 14);
610 int i02 = 2 + i * ( 3 * i - 7) / 2;
611 int i11 = 11 - i * ( 9 * i - 11) / 2;
612 int i23 = 23 - 8 * i;
613 int i14 = 14 + i * ( 9 * i - 20);
619 std::swap(rubik.corn_[i09], rubik.corn_[i00]);
620 std::swap(rubik.corn_[i21], rubik.corn_[i09]);
621 std::swap(rubik.corn_[i12], rubik.corn_[i21]);
624 std::swap(rubik.corn_[i11], rubik.corn_[i01]);
625 std::swap(rubik.corn_[i22], rubik.corn_[i11]);
626 std::swap(rubik.corn_[i14], rubik.corn_[i22]);
629 std::swap(rubik.corn_[i10], rubik.corn_[i02]);
630 std::swap(rubik.corn_[i23], rubik.corn_[i10]);
631 std::swap(rubik.corn_[i13], rubik.corn_[i23]);
635 std::swap(rubik.corn_[i00], rubik.corn_[i21]);
636 std::swap(rubik.corn_[i09], rubik.corn_[i12]);
637 std::swap(rubik.corn_[i01], rubik.corn_[i22]);
638 std::swap(rubik.corn_[i11], rubik.corn_[i14]);
639 std::swap(rubik.corn_[i02], rubik.corn_[i23]);
640 std::swap(rubik.corn_[i10], rubik.corn_[i13]);
644 std::swap(rubik.corn_[i12], rubik.corn_[i00]);
645 std::swap(rubik.corn_[i21], rubik.corn_[i12]);
646 std::swap(rubik.corn_[i09], rubik.corn_[i21]);
649 std::swap(rubik.corn_[i14], rubik.corn_[i01]);
650 std::swap(rubik.corn_[i22], rubik.corn_[i14]);
651 std::swap(rubik.corn_[i11], rubik.corn_[i22]);
654 std::swap(rubik.corn_[i13], rubik.corn_[i02]);
655 std::swap(rubik.corn_[i23], rubik.corn_[i13]);
656 std::swap(rubik.corn_[i10], rubik.corn_[i23]);
666 int i03 = 3 - i * ( 3 * i - 17) / 2;
667 int i06 = 6 - i * (21 * i - 53) / 2;
669 int i15 = 15 + i * (12 * i - 20);
671 int i04 = 4 - i * ( 3 * i - 10);
672 int i07 = 7 - i * (12 * i - 28);
673 int i19 = 19 - i * ( 3 * i - 5) / 2;
674 int i16 = 16 + i * (21 * i - 37) / 2;
677 int i08 = 8 - i * ( 9 * i - 22);
678 int i20 = 20 + i * ( 3 * i - 7) / 2;
679 int i17 = 17 + i * (27 * i - 49) / 2;
685 std::swap(rubik.corn_[i06], rubik.corn_[i03]);
686 std::swap(rubik.corn_[i18], rubik.corn_[i06]);
687 std::swap(rubik.corn_[i15], rubik.corn_[i18]);
690 std::swap(rubik.corn_[i08], rubik.corn_[i04]);
691 std::swap(rubik.corn_[i19], rubik.corn_[i08]);
692 std::swap(rubik.corn_[i17], rubik.corn_[i19]);
695 std::swap(rubik.corn_[i07], rubik.corn_[i05]);
696 std::swap(rubik.corn_[i20], rubik.corn_[i07]);
697 std::swap(rubik.corn_[i16], rubik.corn_[i20]);
701 std::swap(rubik.corn_[i03], rubik.corn_[i18]);
702 std::swap(rubik.corn_[i15], rubik.corn_[i06]);
703 std::swap(rubik.corn_[i04], rubik.corn_[i19]);
704 std::swap(rubik.corn_[i17], rubik.corn_[i08]);
705 std::swap(rubik.corn_[i05], rubik.corn_[i20]);
706 std::swap(rubik.corn_[i16], rubik.corn_[i07]);
710 std::swap(rubik.corn_[i15], rubik.corn_[i03]);
711 std::swap(rubik.corn_[i18], rubik.corn_[i15]);
712 std::swap(rubik.corn_[i06], rubik.corn_[i18]);
715 std::swap(rubik.corn_[i17], rubik.corn_[i04]);
716 std::swap(rubik.corn_[i19], rubik.corn_[i17]);
717 std::swap(rubik.corn_[i08], rubik.corn_[i19]);
720 std::swap(rubik.corn_[i16], rubik.corn_[i05]);
721 std::swap(rubik.corn_[i20], rubik.corn_[i16]);
722 std::swap(rubik.corn_[i07], rubik.corn_[i20]);
731 int i = (axis ==
'x') ? 0 : ((axis ==
'y') ? 1 : 2);
735 int i06 = 6 - i * (13 * i - 23);
736 int i14 = 14 - i * ( 9 * i - 13);
737 int i16 = 16 + i * (11 * i - 27);
738 int i22 = 22 + i * ( 4 * i - 18);
744 std::swap(rubik.edge_[i22], rubik.edge_[i06]);
745 std::swap(rubik.edge_[i14+1], rubik.edge_[i22]);
746 std::swap(rubik.edge_[i16+1], rubik.edge_[i14+1]);
748 std::swap(rubik.edge_[i22+1], rubik.edge_[i06+1]);
749 std::swap(rubik.edge_[i14], rubik.edge_[i22+1]);
750 std::swap(rubik.edge_[i16], rubik.edge_[i14]);
754 std::swap(rubik.edge_[i06], rubik.edge_[i14+1]);
755 std::swap(rubik.edge_[i06+1], rubik.edge_[i14]);
756 std::swap(rubik.edge_[i16], rubik.edge_[i22+1]);
757 std::swap(rubik.edge_[i16+1], rubik.edge_[i22]);
761 std::swap(rubik.edge_[i16+1], rubik.edge_[i06]);
762 std::swap(rubik.edge_[i14+1], rubik.edge_[i16+1]);
763 std::swap(rubik.edge_[i22], rubik.edge_[i14+1]);
765 std::swap(rubik.edge_[i16], rubik.edge_[i06+1]);
766 std::swap(rubik.edge_[i14], rubik.edge_[i16]);
767 std::swap(rubik.edge_[i22+1], rubik.edge_[i14]);
776 int i00 = 0 + i * ( 2 * i + 4);
777 int i04 = 4 - i * ( 3 * i - 13);
778 int i08 = 8 + i * (13 * i - 19);
779 int i12 = 12 + i * ( 6 * i - 8);
785 std::swap(rubik.edge_[i04], rubik.edge_[i00]);
786 std::swap(rubik.edge_[i12], rubik.edge_[i04]);
787 std::swap(rubik.edge_[i08], rubik.edge_[i12]);
789 std::swap(rubik.edge_[i04+1], rubik.edge_[i00+1]);
790 std::swap(rubik.edge_[i12+1], rubik.edge_[i04+1]);
791 std::swap(rubik.edge_[i08+1], rubik.edge_[i12+1]);
795 std::swap(rubik.edge_[i00], rubik.edge_[i12]);
796 std::swap(rubik.edge_[i00+1], rubik.edge_[i12+1]);
797 std::swap(rubik.edge_[i04], rubik.edge_[i08]);
798 std::swap(rubik.edge_[i04+1], rubik.edge_[i08+1]);
802 std::swap(rubik.edge_[i08], rubik.edge_[i00]);
803 std::swap(rubik.edge_[i12], rubik.edge_[i08]);
804 std::swap(rubik.edge_[i04], rubik.edge_[i12]);
806 std::swap(rubik.edge_[i08+1], rubik.edge_[i00+1]);
807 std::swap(rubik.edge_[i12+1], rubik.edge_[i08+1]);
808 std::swap(rubik.edge_[i04+1], rubik.edge_[i12+1]);
817 int i02 = 2 - i * (17 * i - 37);
818 int i10 = 10 - i * ( 9 * i - 19);
819 int i18 = 18 + i * (12 * i - 26);
820 int i20 = 20 + i * ( 3 * i - 11);
826 std::swap(rubik.edge_[i20], rubik.edge_[i02]);
827 std::swap(rubik.edge_[i10+1], rubik.edge_[i20]);
828 std::swap(rubik.edge_[i18+1], rubik.edge_[i10+1]);
830 std::swap(rubik.edge_[i20+1], rubik.edge_[i02+1]);
831 std::swap(rubik.edge_[i10], rubik.edge_[i20+1]);
832 std::swap(rubik.edge_[i18], rubik.edge_[i10]);
836 std::swap(rubik.edge_[i02], rubik.edge_[i10+1]);
837 std::swap(rubik.edge_[i02+1], rubik.edge_[i10]);
838 std::swap(rubik.edge_[i18], rubik.edge_[i20+1]);
839 std::swap(rubik.edge_[i18+1], rubik.edge_[i20]);
843 std::swap(rubik.edge_[i18+1], rubik.edge_[i02]);
844 std::swap(rubik.edge_[i10+1], rubik.edge_[i18+1]);
845 std::swap(rubik.edge_[i20], rubik.edge_[i10+1]);
847 std::swap(rubik.edge_[i18], rubik.edge_[i02+1]);
848 std::swap(rubik.edge_[i10], rubik.edge_[i18]);
849 std::swap(rubik.edge_[i20+1], rubik.edge_[i10]);
858 if (incr == 0) {
return; }
878 out <<
"Rubik's Cube State:\n";
880 for (
int i=0; i<6; i++)
882 out <<
" " << rubik.cent_[i];
886 for (
int i=0; i<12; i++)
888 out <<
" " << rubik.edge_[2 * i + 0]
889 <<
":" << rubik.edge_[2 * i + 1];
893 for (
int i=0; i<8; i++)
895 out <<
" " << rubik.corn_[3 * i + 0]
896 <<
":" << rubik.corn_[3 * i + 1]
897 <<
":" << rubik.corn_[3 * i + 2];
910 for (
int i=0; i<mesh.
GetNBE(); i++)
915 for (
int j=0; j<v.
Size(); j++)
927 if (x[0] > 1.5 - eps)
929 color[elem] = 1.0 / 6.0;
931 else if (x[0] < -1.5 + eps)
933 color[elem] = 2.0 / 6.0;
935 else if (x[1] < -1.5 + eps)
937 color[elem] = 3.0 / 6.0;
939 else if (x[1] > 1.5 - eps)
941 color[elem] = 4.0 / 6.0;
943 else if (x[2] < -1.5 + eps)
945 color[elem] = 5.0 / 6.0;
947 else if (x[2] > 1.5 - eps)
952 sock <<
"solution\n" << mesh << color << flush;
959 MFEM_ASSERT(0 <= min_ind && max_ind <= 6,
"Maximum center index of "
960 << max_ind <<
" is out of range.");
962 for (
int i=min_ind; i<max_ind; i++)
964 if (rubik.cent_[i] != i) {
return false; }
971 MFEM_ASSERT(0 <= min_ind && max_ind <= 12,
"Maximum edge index of "
972 << max_ind <<
" is out of range.");
974 for (
int i=min_ind; i<max_ind; i++)
976 if (rubik.edge_[2 * i + 0] != edge_colors_[2 * i + 0] ||
977 rubik.edge_[2 * i + 1] != edge_colors_[2 * i + 1])
987 MFEM_ASSERT(0 <= min_ind && max_ind <= 8,
"Maximum corner index of "
988 << max_ind <<
" is out of range.");
990 for (
int i=min_ind; i<max_ind; i++)
992 if (rubik.corn_[3 * i + 0] != corn_colors_[3 * i + 0] ||
993 rubik.corn_[3 * i + 1] != corn_colors_[3 * i + 1] ||
994 rubik.corn_[3 * i + 2] != corn_colors_[3 * i + 2])
1005 if (incr == 0) {
return; }
1020 xVec[1] = cosa_ * yVec[1] + sina_ * yVec[2];
1021 xVec[2] = -sina_ * yVec[1] + cosa_ * yVec[2];
1024 xVec[1] = cosa_ * yVec[1] + sina_ * yVec[2];
1025 xVec[2] = -sina_ * yVec[1] + cosa_ * yVec[2];
1028 xVec[1] = cosa_ * yVec[1] - sina_ * yVec[2];
1029 xVec[2] = sina_ * yVec[1] + cosa_ * yVec[2];
1039 xVec[2] = cosa_ * yVec[2] + sina_ * yVec[0];
1040 xVec[0] = -sina_ * yVec[2] + cosa_ * yVec[0];
1043 xVec[2] = cosa_ * yVec[2] + sina_ * yVec[0];
1044 xVec[0] = -sina_ * yVec[2] + cosa_ * yVec[0];
1047 xVec[2] = cosa_ * yVec[2] - sina_ * yVec[0];
1048 xVec[0] = sina_ * yVec[2] + cosa_ * yVec[0];
1058 xVec[0] = cosa_ * yVec[0] + sina_ * yVec[1];
1059 xVec[1] = -sina_ * yVec[0] + cosa_ * yVec[1];
1062 xVec[0] = cosa_ * yVec[0] + sina_ * yVec[1];
1063 xVec[1] = -sina_ * yVec[0] + cosa_ * yVec[1];
1066 xVec[0] = cosa_ * yVec[0] - sina_ * yVec[1];
1067 xVec[1] = sina_ * yVec[0] + cosa_ * yVec[1];
1078 if (incr == 0) { step_ = 0;
return false; }
1079 if (incr != 2 && step_ == nstep_) { step_ = 0;
return false; }
1080 if (incr == 2 && step_ == 2 * nstep_) { step_ = 0;
return false; }
1082 std::set<int> verts;
1084 for (
int i=0; i<mesh.
GetNE(); i++)
1090 for (
int j=0; j<v.
Size(); j++)
1095 for (std::set<int>::iterator sit = verts.begin(); sit!=verts.end(); sit++)
1112 for (
int i=0; i<mesh.
GetNE(); i++)
1117 for (
int j=0; j<v.
Size(); j++)
1127 if ( x[0] > -2.5 + tier && x[0] < -1.5 + tier )
1138 if ( x[1] > -2.5 + tier && x[1] < -1.5 + tier )
1149 if ( x[2] > -2.5 + tier && x[2] < -1.5 + tier )
1171 sock <<
"solution\n" << mesh << color << flush;
1178 for (
int i=0; i<moves.
Size(); i++)
1180 double ran = double(rand()) / RAND_MAX;
1181 int ir = (int)(26 * ran);
1182 int incr = (ir % 3) + 1; ir /= 3;
1183 int tier = (ir % 3) + 1; ir /= 3;
1184 char axis = (ir == 0)?
'x' : ((ir == 1) ?
'y' :
'z');
1188 moves[i].axis = axis;
1189 moves[i].tier = tier;
1190 moves[i].incr = incr;
1192 else if (axis == moves[i-1].axis)
1194 if (tier == moves[i-1].tier)
1196 int new_incr = (moves[i-1].incr + incr) % 4;
1199 moves[i-1].incr = new_incr;
1203 else if (incr == moves[i-1].incr)
1205 moves[i-1].tier = 6 - moves[i-1].tier - tier;
1206 moves[i-1].incr = 4 - incr;
1212 moves[i].axis = axis;
1213 moves[i].tier = tier;
1214 moves[i].incr = incr;
1223 for (
int i=0; i<6; i++)
1225 if (rubik.cent_[i] == 5)
1234 anim_move(
'x', 2, 2, mesh, color, sock);
1237 anim_move(
'x', 2, 1, mesh, color, sock);
1240 anim_move(
'y', 2, 1, mesh, color, sock);
1243 anim_move(
'x', 2, 3, mesh, color, sock);
1246 anim_move(
'y', 2, 3, mesh, color, sock);
1259 bool allWrong =
true;
1260 bool allRight =
true;
1261 for (
int i=0; i<6; i++)
1263 if (rubik.cent_[i] == i)
1274 if (allRight) {
return; }
1282 if (rubik.cent_[2] == 2)
1286 switch (rubik.cent_[0])
1299 else if (rubik.cent_[1] == 1)
1303 switch (rubik.cent_[0])
1320 switch (rubik.cent_[1])
1333 anim_move(axis, 2, incr, mesh, color, sock);
1339 for (
int i=1; i<6; i++)
1341 if (rubik.cent_[i] == 0)
1353 axis =
'x'; incr = 3;
1356 axis =
'y'; incr = 3;
1359 axis =
'x'; incr = 1;
1362 axis =
'y'; incr = 1;
1365 axis =
'x'; incr = 2;
1368 anim_move(axis, 2, incr, mesh, color, sock);
1378 for (
int i=0; i<8; i++)
1380 if (rubik.corn_[3 * i + 0] == corn_colors_[3 * ind + 0] &&
1381 rubik.corn_[3 * i + 1] == corn_colors_[3 * ind + 1] &&
1382 rubik.corn_[3 * i + 2] == corn_colors_[3 * ind + 2])
1386 else if (rubik.corn_[3 * i + 0] == corn_colors_[3 * ind + 1] &&
1387 rubik.corn_[3 * i + 1] == corn_colors_[3 * ind + 2] &&
1388 rubik.corn_[3 * i + 2] == corn_colors_[3 * ind + 0])
1392 else if (rubik.corn_[3 * i + 0] == corn_colors_[3 * ind + 2] &&
1393 rubik.corn_[3 * i + 1] == corn_colors_[3 * ind + 0] &&
1394 rubik.corn_[3 * i + 2] == corn_colors_[3 * ind + 1])
1398 else if (rubik.corn_[3 * i + 0] == corn_colors_[3 * ind + 2] &&
1399 rubik.corn_[3 * i + 1] == corn_colors_[3 * ind + 1] &&
1400 rubik.corn_[3 * i + 2] == corn_colors_[3 * ind + 0])
1404 else if (rubik.corn_[3 * i + 0] == corn_colors_[3 * ind + 1] &&
1405 rubik.corn_[3 * i + 1] == corn_colors_[3 * ind + 0] &&
1406 rubik.corn_[3 * i + 2] == corn_colors_[3 * ind + 2])
1410 else if (rubik.corn_[3 * i + 0] == corn_colors_[3 * ind + 0] &&
1411 rubik.corn_[3 * i + 1] == corn_colors_[3 * ind + 2] &&
1412 rubik.corn_[3 * i + 2] == corn_colors_[3 * ind + 1])
1430 anim_move(
'x', 1, 3, mesh, color, sock);
1431 anim_move(
'z', 1, 3, mesh, color, sock);
1432 anim_move(
'x', 1, 1, mesh, color, sock);
1435 anim_move(
'y', 1, 1, mesh, color, sock);
1436 anim_move(
'z', 1, 3, mesh, color, sock);
1437 anim_move(
'y', 1, 3, mesh, color, sock);
1438 anim_move(
'x', 1, 3, mesh, color, sock);
1439 anim_move(
'z', 1, 2, mesh, color, sock);
1440 anim_move(
'x', 1, 1, mesh, color, sock);
1443 anim_move(
'y', 1, 1, mesh, color, sock);
1444 anim_move(
'z', 1, 1, mesh, color, sock);
1445 anim_move(
'y', 1, 3, mesh, color, sock);
1453 anim_move(
'x', 2, 1, mesh, color, sock);
1454 anim_move(
'y', 1, 2, mesh, color, sock);
1455 anim_move(
'x', 2, 3, mesh, color, sock);
1458 anim_move(
'z', 1, 1, mesh, color, sock);
1459 anim_move(
'x', 2, 1, mesh, color, sock);
1460 anim_move(
'y', 1, 3, mesh, color, sock);
1461 anim_move(
'x', 2, 3, mesh, color, sock);
1464 anim_move(
'x', 1, 3, mesh, color, sock);
1465 anim_move(
'z', 1, 1, mesh, color, sock);
1466 anim_move(
'x', 1, 1, mesh, color, sock);
1474 anim_move(
'y', 1, 1, mesh, color, sock);
1475 anim_move(
'z', 1, 2, mesh, color, sock);
1476 anim_move(
'y', 1, 3, mesh, color, sock);
1479 anim_move(
'x', 3, 1, mesh, color, sock);
1480 anim_move(
'z', 1, 1, mesh, color, sock);
1481 anim_move(
'x', 3, 3, mesh, color, sock);
1482 anim_move(
'x', 2, 1, mesh, color, sock);
1483 anim_move(
'y', 1, 3, mesh, color, sock);
1484 anim_move(
'x', 2, 3, mesh, color, sock);
1487 anim_move(
'x', 1, 3, mesh, color, sock);
1488 anim_move(
'z', 1, 2, mesh, color, sock);
1489 anim_move(
'x', 1, 1, mesh, color, sock);
1497 anim_move(
'y', 2, 3, mesh, color, sock);
1498 anim_move(
'x', 1, 2, mesh, color, sock);
1499 anim_move(
'y', 2, 1, mesh, color, sock);
1502 anim_move(
'y', 1, 1, mesh, color, sock);
1503 anim_move(
'z', 1, 3, mesh, color, sock);
1504 anim_move(
'y', 1, 3, mesh, color, sock);
1507 anim_move(
'z', 1, 3, mesh, color, sock);
1508 anim_move(
'y', 1, 1, mesh, color, sock);
1509 anim_move(
'z', 1, 1, mesh, color, sock);
1510 anim_move(
'y', 1, 3, mesh, color, sock);
1518 anim_move(
'y', 1, 1, mesh, color, sock);
1519 anim_move(
'z', 1, 1, mesh, color, sock);
1520 anim_move(
'y', 1, 3, mesh, color, sock);
1521 anim_move(
'z', 1, 3, mesh, color, sock);
1522 anim_move(
'y', 1, 1, mesh, color, sock);
1523 anim_move(
'z', 1, 1, mesh, color, sock);
1524 anim_move(
'y', 1, 3, mesh, color, sock);
1527 anim_move(
'x', 1, 3, mesh, color, sock);
1528 anim_move(
'z', 1, 3, mesh, color, sock);
1529 anim_move(
'x', 1, 1, mesh, color, sock);
1530 anim_move(
'z', 1, 1, mesh, color, sock);
1531 anim_move(
'x', 1, 3, mesh, color, sock);
1532 anim_move(
'z', 1, 3, mesh, color, sock);
1533 anim_move(
'x', 1, 1, mesh, color, sock);
1541 anim_move(
'x', 2, 1, mesh, color, sock);
1542 anim_move(
'y', 1, 1, mesh, color, sock);
1543 anim_move(
'x', 2, 3, mesh, color, sock);
1546 anim_move(
'x', 3, 3, mesh, color, sock);
1547 anim_move(
'z', 1, 1, mesh, color, sock);
1548 anim_move(
'x', 3, 1, mesh, color, sock);
1549 anim_move(
'x', 1, 3, mesh, color, sock);
1550 anim_move(
'z', 1, 3, mesh, color, sock);
1551 anim_move(
'x', 1, 1, mesh, color, sock);
1554 anim_move(
'y', 1, 3, mesh, color, sock);
1555 anim_move(
'z', 1, 3, mesh, color, sock);
1556 anim_move(
'y', 1, 2, mesh, color, sock);
1557 anim_move(
'z', 1, 2, mesh, color, sock);
1558 anim_move(
'y', 1, 3, mesh, color, sock);
1566 anim_move(
'y', 1, 1, mesh, color, sock);
1567 anim_move(
'y', 3, 3, mesh, color, sock);
1568 anim_move(
'z', 1, 2, mesh, color, sock);
1569 anim_move(
'y', 3, 1, mesh, color, sock);
1570 anim_move(
'y', 1, 3, mesh, color, sock);
1573 anim_move(
'x', 3, 1, mesh, color, sock);
1574 anim_move(
'z', 1, 1, mesh, color, sock);
1575 anim_move(
'x', 3, 3, mesh, color, sock);
1576 anim_move(
'x', 1, 3, mesh, color, sock);
1577 anim_move(
'z', 1, 2, mesh, color, sock);
1578 anim_move(
'x', 1, 1, mesh, color, sock);
1581 anim_move(
'y', 3, 3, mesh, color, sock);
1582 anim_move(
'z', 1, 3, mesh, color, sock);
1583 anim_move(
'y', 3, 1, mesh, color, sock);
1584 anim_move(
'y', 1, 1, mesh, color, sock);
1585 anim_move(
'z', 1, 2, mesh, color, sock);
1586 anim_move(
'y', 1, 3, mesh, color, sock);
1594 anim_move(
'x', 1, 1, mesh, color, sock);
1595 anim_move(
'z', 1, 1, mesh, color, sock);
1596 anim_move(
'x', 1, 2, mesh, color, sock);
1597 anim_move(
'z', 1, 2, mesh, color, sock);
1598 anim_move(
'x', 1, 1, mesh, color, sock);
1601 anim_move(
'y', 3, 1, mesh, color, sock);
1602 anim_move(
'z', 1, 3, mesh, color, sock);
1603 anim_move(
'y', 3, 3, mesh, color, sock);
1604 anim_move(
'y', 1, 1, mesh, color, sock);
1605 anim_move(
'z', 1, 1, mesh, color, sock);
1606 anim_move(
'y', 1, 3, mesh, color, sock);
1609 anim_move(
'y', 2, 3, mesh, color, sock);
1610 anim_move(
'x', 1, 3, mesh, color, sock);
1611 anim_move(
'y', 2, 1, mesh, color, sock);
1628 anim_move(
'z', 1, 2, mesh, color, sock);
1629 anim_move(
'y', 2, 1, mesh, color, sock);
1630 anim_move(
'x', 3, 2, mesh, color, sock);
1631 anim_move(
'y', 2, 3, mesh, color, sock);
1634 anim_move(
'z', 1, 3, mesh, color, sock);
1635 anim_move(
'x', 3, 3, mesh, color, sock);
1636 anim_move(
'z', 1, 1, mesh, color, sock);
1637 anim_move(
'x', 3, 1, mesh, color, sock);
1640 anim_move(
'x', 3, 3, mesh, color, sock);
1641 anim_move(
'z', 1, 3, mesh, color, sock);
1642 anim_move(
'x', 3, 1, mesh, color, sock);
1650 anim_move(
'x', 3, 3, mesh, color, sock);
1651 anim_move(
'z', 1, 1, mesh, color, sock);
1652 anim_move(
'x', 3, 1, mesh, color, sock);
1655 anim_move(
'y', 1, 3, mesh, color, sock);
1656 anim_move(
'z', 1, 1, mesh, color, sock);
1657 anim_move(
'y', 1, 1, mesh, color, sock);
1658 anim_move(
'x', 3, 3, mesh, color, sock);
1659 anim_move(
'z', 1, 2, mesh, color, sock);
1660 anim_move(
'x', 3, 1, mesh, color, sock);
1663 anim_move(
'y', 1, 3, mesh, color, sock);
1664 anim_move(
'z', 1, 3, mesh, color, sock);
1665 anim_move(
'y', 1, 1, mesh, color, sock);
1673 anim_move(
'y', 2, 1, mesh, color, sock);
1674 anim_move(
'x', 3, 2, mesh, color, sock);
1675 anim_move(
'y', 2, 3, mesh, color, sock);
1678 anim_move(
'y', 1, 3, mesh, color, sock);
1679 anim_move(
'z', 1, 1, mesh, color, sock);
1680 anim_move(
'y', 1, 1, mesh, color, sock);
1683 anim_move(
'z', 1, 1, mesh, color, sock);
1684 anim_move(
'y', 2, 1, mesh, color, sock);
1685 anim_move(
'x', 3, 1, mesh, color, sock);
1686 anim_move(
'y', 2, 3, mesh, color, sock);
1694 anim_move(
'y', 1, 3, mesh, color, sock);
1695 anim_move(
'z', 1, 2, mesh, color, sock);
1696 anim_move(
'y', 1, 1, mesh, color, sock);
1699 anim_move(
'z', 1, 1, mesh, color, sock);
1700 anim_move(
'y', 2, 1, mesh, color, sock);
1701 anim_move(
'x', 3, 2, mesh, color, sock);
1702 anim_move(
'y', 2, 3, mesh, color, sock);
1705 anim_move(
'x', 3, 3, mesh, color, sock);
1706 anim_move(
'z', 1, 2, mesh, color, sock);
1707 anim_move(
'x', 3, 1, mesh, color, sock);
1715 anim_move(
'y', 1, 3, mesh, color, sock);
1716 anim_move(
'z', 1, 3, mesh, color, sock);
1717 anim_move(
'y', 1, 1, mesh, color, sock);
1718 anim_move(
'z', 1, 1, mesh, color, sock);
1719 anim_move(
'y', 1, 3, mesh, color, sock);
1720 anim_move(
'z', 1, 3, mesh, color, sock);
1721 anim_move(
'y', 1, 1, mesh, color, sock);
1724 anim_move(
'x', 3, 3, mesh, color, sock);
1725 anim_move(
'z', 1, 1, mesh, color, sock);
1726 anim_move(
'x', 3, 1, mesh, color, sock);
1727 anim_move(
'z', 1, 3, mesh, color, sock);
1728 anim_move(
'x', 3, 3, mesh, color, sock);
1729 anim_move(
'z', 1, 1, mesh, color, sock);
1730 anim_move(
'x', 3, 1, mesh, color, sock);
1738 anim_move(
'x', 3, 1, mesh, color, sock);
1739 anim_move(
'z', 1, 3, mesh, color, sock);
1740 anim_move(
'x', 3, 2, mesh, color, sock);
1741 anim_move(
'z', 1, 2, mesh, color, sock);
1742 anim_move(
'x', 3, 1, mesh, color, sock);
1745 anim_move(
'y', 3, 3, mesh, color, sock);
1746 anim_move(
'z', 1, 1, mesh, color, sock);
1747 anim_move(
'y', 3, 1, mesh, color, sock);
1748 anim_move(
'y', 1, 3, mesh, color, sock);
1749 anim_move(
'z', 1, 3, mesh, color, sock);
1750 anim_move(
'y', 1, 1, mesh, color, sock);
1753 anim_move(
'y', 2, 1, mesh, color, sock);
1754 anim_move(
'x', 3, 3, mesh, color, sock);
1755 anim_move(
'y', 2, 3, mesh, color, sock);
1763 anim_move(
'y', 1, 3, mesh, color, sock);
1764 anim_move(
'y', 3, 1, mesh, color, sock);
1765 anim_move(
'z', 1, 2, mesh, color, sock);
1766 anim_move(
'y', 3, 3, mesh, color, sock);
1767 anim_move(
'y', 1, 1, mesh, color, sock);
1770 anim_move(
'x', 1, 1, mesh, color, sock);
1771 anim_move(
'z', 1, 3, mesh, color, sock);
1772 anim_move(
'x', 1, 3, mesh, color, sock);
1773 anim_move(
'x', 3, 3, mesh, color, sock);
1774 anim_move(
'z', 1, 2, mesh, color, sock);
1775 anim_move(
'x', 3, 1, mesh, color, sock);
1778 anim_move(
'y', 3, 1, mesh, color, sock);
1779 anim_move(
'z', 1, 1, mesh, color, sock);
1780 anim_move(
'y', 3, 3, mesh, color, sock);
1781 anim_move(
'y', 1, 3, mesh, color, sock);
1782 anim_move(
'z', 1, 2, mesh, color, sock);
1783 anim_move(
'y', 1, 1, mesh, color, sock);
1800 anim_move(
'y', 3, 3, mesh, color, sock);
1801 anim_move(
'z', 1, 2, mesh, color, sock);
1802 anim_move(
'y', 3, 1, mesh, color, sock);
1805 anim_move(
'z', 1, 1, mesh, color, sock);
1806 anim_move(
'x', 2, 3, mesh, color, sock);
1807 anim_move(
'y', 3, 2, mesh, color, sock);
1808 anim_move(
'x', 2, 1, mesh, color, sock);
1811 anim_move(
'x', 3, 1, mesh, color, sock);
1812 anim_move(
'z', 1, 2, mesh, color, sock);
1813 anim_move(
'x', 3, 3, mesh, color, sock);
1821 anim_move(
'z', 1, 2, mesh, color, sock);
1822 anim_move(
'x', 2, 3, mesh, color, sock);
1823 anim_move(
'y', 3, 2, mesh, color, sock);
1824 anim_move(
'x', 2, 1, mesh, color, sock);
1827 anim_move(
'y', 3, 3, mesh, color, sock);
1828 anim_move(
'z', 1, 3, mesh, color, sock);
1829 anim_move(
'y', 3, 1, mesh, color, sock);
1832 anim_move(
'z', 1, 1, mesh, color, sock);
1833 anim_move(
'x', 3, 1, mesh, color, sock);
1834 anim_move(
'z', 1, 2, mesh, color, sock);
1835 anim_move(
'x', 3, 3, mesh, color, sock);
1843 anim_move(
'x', 3, 1, mesh, color, sock);
1844 anim_move(
'z', 1, 3, mesh, color, sock);
1845 anim_move(
'x', 3, 3, mesh, color, sock);
1848 anim_move(
'x', 3, 1, mesh, color, sock);
1849 anim_move(
'z', 1, 1, mesh, color, sock);
1850 anim_move(
'x', 3, 3, mesh, color, sock);
1851 anim_move(
'y', 3, 3, mesh, color, sock);
1852 anim_move(
'z', 1, 2, mesh, color, sock);
1853 anim_move(
'y', 3, 1, mesh, color, sock);
1856 anim_move(
'y', 3, 3, mesh, color, sock);
1857 anim_move(
'z', 1, 1, mesh, color, sock);
1858 anim_move(
'y', 3, 1, mesh, color, sock);
1866 anim_move(
'x', 2, 3, mesh, color, sock);
1867 anim_move(
'y', 3, 2, mesh, color, sock);
1868 anim_move(
'x', 2, 1, mesh, color, sock);
1871 anim_move(
'z', 1, 1, mesh, color, sock);
1872 anim_move(
'x', 2, 3, mesh, color, sock);
1873 anim_move(
'y', 3, 1, mesh, color, sock);
1874 anim_move(
'x', 2, 1, mesh, color, sock);
1877 anim_move(
'x', 3, 1, mesh, color, sock);
1878 anim_move(
'z', 1, 1, mesh, color, sock);
1879 anim_move(
'x', 3, 3, mesh, color, sock);
1887 anim_move(
'y', 3, 3, mesh, color, sock);
1888 anim_move(
'z', 1, 1, mesh, color, sock);
1889 anim_move(
'y', 3, 1, mesh, color, sock);
1890 anim_move(
'z', 1, 3, mesh, color, sock);
1891 anim_move(
'y', 3, 3, mesh, color, sock);
1892 anim_move(
'z', 1, 1, mesh, color, sock);
1893 anim_move(
'y', 3, 1, mesh, color, sock);
1896 anim_move(
'x', 3, 1, mesh, color, sock);
1897 anim_move(
'z', 1, 3, mesh, color, sock);
1898 anim_move(
'x', 3, 3, mesh, color, sock);
1899 anim_move(
'z', 1, 1, mesh, color, sock);
1900 anim_move(
'x', 3, 1, mesh, color, sock);
1901 anim_move(
'z', 1, 3, mesh, color, sock);
1902 anim_move(
'x', 3, 3, mesh, color, sock);
1910 anim_move(
'x', 2, 3, mesh, color, sock);
1911 anim_move(
'y', 3, 3, mesh, color, sock);
1912 anim_move(
'x', 2, 1, mesh, color, sock);
1915 anim_move(
'x', 1, 1, mesh, color, sock);
1916 anim_move(
'z', 1, 1, mesh, color, sock);
1917 anim_move(
'x', 1, 3, mesh, color, sock);
1918 anim_move(
'x', 3, 1, mesh, color, sock);
1919 anim_move(
'z', 1, 3, mesh, color, sock);
1920 anim_move(
'x', 3, 3, mesh, color, sock);
1923 anim_move(
'y', 3, 1, mesh, color, sock);
1924 anim_move(
'z', 1, 3, mesh, color, sock);
1925 anim_move(
'y', 3, 2, mesh, color, sock);
1926 anim_move(
'z', 1, 2, mesh, color, sock);
1927 anim_move(
'y', 3, 1, mesh, color, sock);
1944 anim_move(
'z', 1, 1, mesh, color, sock);
1945 anim_move(
'y', 3, 1, mesh, color, sock);
1946 anim_move(
'z', 1, 1, mesh, color, sock);
1947 anim_move(
'y', 3, 3, mesh, color, sock);
1948 anim_move(
'x', 1, 1, mesh, color, sock);
1949 anim_move(
'z', 1, 2, mesh, color, sock);
1950 anim_move(
'x', 1, 3, mesh, color, sock);
1953 anim_move(
'y', 3, 1, mesh, color, sock);
1954 anim_move(
'z', 1, 1, mesh, color, sock);
1955 anim_move(
'y', 3, 3, mesh, color, sock);
1958 anim_move(
'z', 1, 3, mesh, color, sock);
1959 anim_move(
'x', 1, 1, mesh, color, sock);
1960 anim_move(
'z', 1, 2, mesh, color, sock);
1961 anim_move(
'x', 1, 3, mesh, color, sock);
1969 anim_move(
'y', 3, 1, mesh, color, sock);
1970 anim_move(
'z', 1, 2, mesh, color, sock);
1971 anim_move(
'y', 3, 3, mesh, color, sock);
1974 anim_move(
'z', 1, 2, mesh, color, sock);
1975 anim_move(
'x', 1, 1, mesh, color, sock);
1976 anim_move(
'z', 1, 3, mesh, color, sock);
1977 anim_move(
'x', 1, 3, mesh, color, sock);
1978 anim_move(
'y', 3, 1, mesh, color, sock);
1979 anim_move(
'z', 1, 2, mesh, color, sock);
1980 anim_move(
'y', 3, 3, mesh, color, sock);
1983 anim_move(
'x', 1, 1, mesh, color, sock);
1984 anim_move(
'z', 1, 2, mesh, color, sock);
1985 anim_move(
'x', 1, 3, mesh, color, sock);
1993 anim_move(
'z', 1, 3, mesh, color, sock);
1994 anim_move(
'x', 1, 1, mesh, color, sock);
1995 anim_move(
'z', 1, 3, mesh, color, sock);
1996 anim_move(
'x', 1, 3, mesh, color, sock);
1997 anim_move(
'y', 3, 1, mesh, color, sock);
1998 anim_move(
'z', 1, 2, mesh, color, sock);
1999 anim_move(
'y', 3, 3, mesh, color, sock);
2002 anim_move(
'z', 1, 1, mesh, color, sock);
2003 anim_move(
'y', 3, 1, mesh, color, sock);
2004 anim_move(
'z', 1, 2, mesh, color, sock);
2005 anim_move(
'y', 3, 3, mesh, color, sock);
2008 anim_move(
'x', 1, 1, mesh, color, sock);
2009 anim_move(
'z', 1, 3, mesh, color, sock);
2010 anim_move(
'x', 1, 3, mesh, color, sock);
2018 anim_move(
'x', 1, 1, mesh, color, sock);
2019 anim_move(
'z', 1, 1, mesh, color, sock);
2020 anim_move(
'x', 1, 3, mesh, color, sock);
2023 anim_move(
'y', 3, 1, mesh, color, sock);
2024 anim_move(
'z', 1, 1, mesh, color, sock);
2025 anim_move(
'y', 3, 3, mesh, color, sock);
2026 anim_move(
'x', 1, 1, mesh, color, sock);
2027 anim_move(
'z', 1, 2, mesh, color, sock);
2028 anim_move(
'x', 1, 3, mesh, color, sock);
2031 anim_move(
'y', 3, 1, mesh, color, sock);
2032 anim_move(
'z', 1, 3, mesh, color, sock);
2033 anim_move(
'y', 3, 3, mesh, color, sock);
2041 anim_move(
'y', 3, 1, mesh, color, sock);
2042 anim_move(
'z', 1, 3, mesh, color, sock);
2043 anim_move(
'y', 3, 3, mesh, color, sock);
2044 anim_move(
'z', 1, 1, mesh, color, sock);
2045 anim_move(
'y', 3, 1, mesh, color, sock);
2046 anim_move(
'z', 1, 3, mesh, color, sock);
2047 anim_move(
'y', 3, 3, mesh, color, sock);
2050 anim_move(
'x', 1, 1, mesh, color, sock);
2051 anim_move(
'z', 1, 1, mesh, color, sock);
2052 anim_move(
'x', 1, 3, mesh, color, sock);
2053 anim_move(
'z', 1, 3, mesh, color, sock);
2054 anim_move(
'x', 1, 1, mesh, color, sock);
2055 anim_move(
'z', 1, 1, mesh, color, sock);
2056 anim_move(
'x', 1, 3, mesh, color, sock);
2068 cout <<
"Entering solve_top_corners" << endl;
2081 cout <<
"Location of 4-th corner: " << i4
2082 <<
" with orientation " << o4 << endl;
2095 cout <<
"Location of 5-th corner: " << i5
2096 <<
" with orientation " << o5 << endl;
2109 cout <<
"Location of 6-th corner: " << i6
2110 <<
" with orientation " << o6 << endl;
2123 cout <<
"Location of 7-th corner: " << i7
2124 <<
" with orientation " << o7 << endl;
2135 for (
int i=0; i<12; i++)
2137 if ((rubik.edge_[2 * i + 0] == edge_colors_[2 * ind + 0] &&
2138 rubik.edge_[2 * i + 1] == edge_colors_[2 * ind + 1]))
2142 if ((rubik.edge_[2 * i + 0] == edge_colors_[2 * ind + 1] &&
2143 rubik.edge_[2 * i + 1] == edge_colors_[2 * ind + 0]))
2160 anim_move(
'y', 2, 1, mesh, color, sock);
2161 anim_move(
'x', 2, 1, mesh, color, sock);
2162 anim_move(
'y', 2, 3, mesh, color, sock);
2165 anim_move(
'x', 3, 1, mesh, color, sock);
2166 anim_move(
'y', 1, 1, mesh, color, sock);
2169 anim_move(
'y', 3, 2, mesh, color, sock);
2170 anim_move(
'z', 3, 2, mesh, color, sock);
2173 anim_move(
'x', 1, 2, mesh, color, sock);
2174 anim_move(
'z', 3, 3, mesh, color, sock);
2177 anim_move(
'z', 3, 1, mesh, color, sock);
2180 anim_move(
'y', 2, 1, mesh, color, sock);
2181 anim_move(
'x', 2, 3, mesh, color, sock);
2182 anim_move(
'y', 2, 3, mesh, color, sock);
2185 anim_move(
'y', 2, 3, mesh, color, sock);
2186 anim_move(
'z', 3, 1, mesh, color, sock);
2187 anim_move(
'y', 2, 1, mesh, color, sock);
2190 anim_move(
'y', 1, 3, mesh, color, sock);
2193 anim_move(
'z', 2, 1, mesh, color, sock);
2194 anim_move(
'y', 1, 3, mesh, color, sock);
2197 anim_move(
'y', 3, 1, mesh, color, sock);
2198 anim_move(
'z', 3, 2, mesh, color, sock);
2201 anim_move(
'x', 1, 3, mesh, color, sock);
2202 anim_move(
'z', 3, 3, mesh, color, sock);
2211 anim_move(
'y', 1, 2, mesh, color, sock);
2214 anim_move(
'z', 1, 3, mesh, color, sock);
2215 anim_move(
'y', 1, 2, mesh, color, sock);
2218 anim_move(
'x', 2, 3, mesh, color, sock);
2219 anim_move(
'z', 3, 1, mesh, color, sock);
2220 anim_move(
'x', 2, 1, mesh, color, sock);
2221 anim_move(
'z', 3, 1, mesh, color, sock);
2224 anim_move(
'y', 2, 3, mesh, color, sock);
2225 anim_move(
'z', 3, 3, mesh, color, sock);
2226 anim_move(
'y', 2, 1, mesh, color, sock);
2229 anim_move(
'y', 1, 3, mesh, color, sock);
2230 anim_move(
'z', 2, 1, mesh, color, sock);
2231 anim_move(
'y', 1, 3, mesh, color, sock);
2234 anim_move(
'y', 2, 1, mesh, color, sock);
2235 anim_move(
'z', 3, 3, mesh, color, sock);
2236 anim_move(
'y', 2, 3, mesh, color, sock);
2239 anim_move(
'z', 3, 2, mesh, color, sock);
2242 anim_move(
'z', 3, 3, mesh, color, sock);
2245 anim_move(
'z', 2, 3, mesh, color, sock);
2246 anim_move(
'y', 1, 1, mesh, color, sock);
2249 anim_move(
'y', 1, 1, mesh, color, sock);
2252 anim_move(
'x', 3, 3, mesh, color, sock);
2253 anim_move(
'z', 3, 1, mesh, color, sock);
2256 anim_move(
'y', 3, 3, mesh, color, sock);
2257 anim_move(
'z', 3, 2, mesh, color, sock);
2272 anim_move(
'y', 1, 3, mesh, color, sock);
2273 anim_move(
'x', 3, 1, mesh, color, sock);
2274 anim_move(
'y', 1, 1, mesh, color, sock);
2277 anim_move(
'x', 2, 3, mesh, color, sock);
2278 anim_move(
'y', 2, 1, mesh, color, sock);
2279 anim_move(
'x', 2, 1, mesh, color, sock);
2282 anim_move(
'z', 1, 1, mesh, color, sock);
2283 anim_move(
'x', 3, 2, mesh, color, sock);
2286 anim_move(
'z', 1, 2, mesh, color, sock);
2287 anim_move(
'x', 3, 2, mesh, color, sock);
2290 anim_move(
'y', 3, 3, mesh, color, sock);
2291 anim_move(
'x', 3, 3, mesh, color, sock);
2294 anim_move(
'x', 2, 1, mesh, color, sock);
2295 anim_move(
'y', 2, 3, mesh, color, sock);
2296 anim_move(
'x', 2, 3, mesh, color, sock);
2299 anim_move(
'z', 2, 3, mesh, color, sock);
2300 anim_move(
'x', 3, 1, mesh, color, sock);
2303 anim_move(
'x', 3, 1, mesh, color, sock);
2306 anim_move(
'z', 2, 1, mesh, color, sock);
2307 anim_move(
'x', 3, 1, mesh, color, sock);
2310 anim_move(
'y', 3, 2, mesh, color, sock);
2311 anim_move(
'x', 3, 3, mesh, color, sock);
2320 anim_move(
'z', 1, 3, mesh, color, sock);
2321 anim_move(
'x', 3, 2, mesh, color, sock);
2324 anim_move(
'x', 3, 2, mesh, color, sock);
2327 anim_move(
'y', 3, 1, mesh, color, sock);
2328 anim_move(
'x', 3, 3, mesh, color, sock);
2331 anim_move(
'z', 1, 2, mesh, color, sock);
2332 anim_move(
'x', 2, 3, mesh, color, sock);
2333 anim_move(
'y', 2, 1, mesh, color, sock);
2334 anim_move(
'x', 2, 1, mesh, color, sock);
2337 anim_move(
'x', 3, 1, mesh, color, sock);
2338 anim_move(
'z', 2, 1, mesh, color, sock);
2339 anim_move(
'x', 3, 1, mesh, color, sock);
2342 anim_move(
'y', 1, 1, mesh, color, sock);
2343 anim_move(
'z', 3, 1, mesh, color, sock);
2344 anim_move(
'y', 1, 3, mesh, color, sock);
2347 anim_move(
'y', 1, 1, mesh, color, sock);
2348 anim_move(
'z', 3, 2, mesh, color, sock);
2349 anim_move(
'y', 1, 3, mesh, color, sock);
2352 anim_move(
'z', 2, 2, mesh, color, sock);
2353 anim_move(
'x', 3, 3, mesh, color, sock);
2356 anim_move(
'z', 2, 3, mesh, color, sock);
2357 anim_move(
'x', 3, 3, mesh, color, sock);
2360 anim_move(
'x', 3, 3, mesh, color, sock);
2363 anim_move(
'z', 2, 1, mesh, color, sock);
2364 anim_move(
'x', 3, 3, mesh, color, sock);
2379 anim_move(
'z', 1, 2, mesh, color, sock);
2380 anim_move(
'y', 3, 2, mesh, color, sock);
2383 anim_move(
'z', 1, 3, mesh, color, sock);
2384 anim_move(
'y', 3, 2, mesh, color, sock);
2387 anim_move(
'y', 3, 1, mesh, color, sock);
2388 anim_move(
'z', 2, 3, mesh, color, sock);
2389 anim_move(
'y', 3, 3, mesh, color, sock);
2392 anim_move(
'x', 1, 3, mesh, color, sock);
2393 anim_move(
'y', 3, 3, mesh, color, sock);
2396 anim_move(
'z', 3, 1, mesh, color, sock);
2397 anim_move(
'y', 3, 1, mesh, color, sock);
2398 anim_move(
'z', 3, 3, mesh, color, sock);
2399 anim_move(
'y', 3, 3, mesh, color, sock);
2402 anim_move(
'z', 2, 1, mesh, color, sock);
2403 anim_move(
'y', 3, 3, mesh, color, sock);
2406 anim_move(
'z', 2, 2, mesh, color, sock);
2407 anim_move(
'y', 3, 3, mesh, color, sock);
2410 anim_move(
'z', 2, 3, mesh, color, sock);
2411 anim_move(
'y', 3, 3, mesh, color, sock);
2414 anim_move(
'y', 3, 3, mesh, color, sock);
2423 anim_move(
'z', 1, 1, mesh, color, sock);
2424 anim_move(
'x', 1, 3, mesh, color, sock);
2425 anim_move(
'y', 3, 3, mesh, color, sock);
2428 anim_move(
'x', 2, 1, mesh, color, sock);
2429 anim_move(
'z', 1, 3, mesh, color, sock);
2430 anim_move(
'x', 2, 3, mesh, color, sock);
2433 anim_move(
'y', 3, 2, mesh, color, sock);
2436 anim_move(
'z', 1, 1, mesh, color, sock);
2437 anim_move(
'y', 3, 2, mesh, color, sock);
2440 anim_move(
'y', 3, 1, mesh, color, sock);
2441 anim_move(
'z', 2, 1, mesh, color, sock);
2442 anim_move(
'y', 3, 1, mesh, color, sock);
2445 anim_move(
'x', 1, 1, mesh, color, sock);
2446 anim_move(
'y', 3, 3, mesh, color, sock);
2449 anim_move(
'z', 2, 2, mesh, color, sock);
2450 anim_move(
'y', 3, 1, mesh, color, sock);
2453 anim_move(
'z', 2, 3, mesh, color, sock);
2454 anim_move(
'y', 3, 1, mesh, color, sock);
2457 anim_move(
'y', 3, 1, mesh, color, sock);
2460 anim_move(
'z', 2, 1, mesh, color, sock);
2461 anim_move(
'y', 3, 1, mesh, color, sock);
2476 anim_move(
'z', 1, 1, mesh, color, sock);
2477 anim_move(
'x', 1, 2, mesh, color, sock);
2480 anim_move(
'z', 1, 2, mesh, color, sock);
2481 anim_move(
'x', 1, 2, mesh, color, sock);
2484 anim_move(
'y', 3, 3, mesh, color, sock);
2485 anim_move(
'x', 1, 3, mesh, color, sock);
2486 anim_move(
'y', 3, 1, mesh, color, sock);
2489 anim_move(
'x', 1, 1, mesh, color, sock);
2490 anim_move(
'z', 2, 1, mesh, color, sock);
2491 anim_move(
'x', 1, 3, mesh, color, sock);
2494 anim_move(
'x', 1, 1, mesh, color, sock);
2497 anim_move(
'z', 2, 1, mesh, color, sock);
2498 anim_move(
'x', 1, 1, mesh, color, sock);
2501 anim_move(
'z', 2, 2, mesh, color, sock);
2502 anim_move(
'x', 1, 1, mesh, color, sock);
2505 anim_move(
'z', 2, 3, mesh, color, sock);
2506 anim_move(
'x', 1, 1, mesh, color, sock);
2515 anim_move(
'y', 1, 3, mesh, color, sock);
2516 anim_move(
'x', 1, 1, mesh, color, sock);
2517 anim_move(
'y', 1, 1, mesh, color, sock);
2520 anim_move(
'z', 1, 3, mesh, color, sock);
2521 anim_move(
'y', 3, 3, mesh, color, sock);
2522 anim_move(
'x', 1, 3, mesh, color, sock);
2523 anim_move(
'y', 3, 1, mesh, color, sock);
2526 anim_move(
'z', 1, 3, mesh, color, sock);
2527 anim_move(
'x', 1, 2, mesh, color, sock);
2530 anim_move(
'x', 1, 2, mesh, color, sock);
2533 anim_move(
'x', 1, 1, mesh, color, sock);
2534 anim_move(
'z', 2, 3, mesh, color, sock);
2535 anim_move(
'x', 1, 1, mesh, color, sock);
2538 anim_move(
'z', 2, 1, mesh, color, sock);
2539 anim_move(
'x', 1, 3, mesh, color, sock);
2542 anim_move(
'z', 2, 2, mesh, color, sock);
2543 anim_move(
'x', 1, 3, mesh, color, sock);
2546 anim_move(
'z', 2, 3, mesh, color, sock);
2547 anim_move(
'x', 1, 3, mesh, color, sock);
2550 anim_move(
'x', 1, 3, mesh, color, sock);
2565 anim_move(
'z', 1, 2, mesh, color, sock);
2566 anim_move(
'y', 1, 1, mesh, color, sock);
2567 anim_move(
'z', 1, 3, mesh, color, sock);
2568 anim_move(
'y', 1, 3, mesh, color, sock);
2569 anim_move(
'x', 1, 1, mesh, color, sock);
2570 anim_move(
'y', 1, 3, mesh, color, sock);
2571 anim_move(
'x', 1, 3, mesh, color, sock);
2572 anim_move(
'y', 1, 1, mesh, color, sock);
2575 anim_move(
'z', 1, 3, mesh, color, sock);
2576 anim_move(
'y', 1, 1, mesh, color, sock);
2577 anim_move(
'z', 1, 3, mesh, color, sock);
2578 anim_move(
'y', 1, 3, mesh, color, sock);
2579 anim_move(
'x', 1, 1, mesh, color, sock);
2580 anim_move(
'y', 1, 3, mesh, color, sock);
2581 anim_move(
'x', 1, 3, mesh, color, sock);
2582 anim_move(
'y', 1, 1, mesh, color, sock);
2585 anim_move(
'z', 1, 1, mesh, color, sock);
2586 anim_move(
'x', 1, 3, mesh, color, sock);
2587 anim_move(
'z', 1, 1, mesh, color, sock);
2588 anim_move(
'x', 1, 1, mesh, color, sock);
2589 anim_move(
'y', 1, 3, mesh, color, sock);
2590 anim_move(
'x', 1, 1, mesh, color, sock);
2591 anim_move(
'y', 1, 1, mesh, color, sock);
2592 anim_move(
'x', 1, 3, mesh, color, sock);
2595 anim_move(
'z', 1, 2, mesh, color, sock);
2596 anim_move(
'x', 1, 3, mesh, color, sock);
2597 anim_move(
'z', 1, 1, mesh, color, sock);
2598 anim_move(
'x', 1, 1, mesh, color, sock);
2599 anim_move(
'y', 1, 3, mesh, color, sock);
2600 anim_move(
'x', 1, 1, mesh, color, sock);
2601 anim_move(
'y', 1, 1, mesh, color, sock);
2602 anim_move(
'x', 1, 3, mesh, color, sock);
2605 anim_move(
'x', 3, 3, mesh, color, sock);
2607 anim_move(
'x', 3, 1, mesh, color, sock);
2608 anim_move(
'z', 1, 1, mesh, color, sock);
2609 anim_move(
'y', 1, 1, mesh, color, sock);
2611 anim_move(
'y', 1, 3, mesh, color, sock);
2614 anim_move(
'z', 2, 1, mesh, color, sock);
2615 anim_move(
'y', 1, 2, mesh, color, sock);
2616 anim_move(
'z', 2, 3, mesh, color, sock);
2617 anim_move(
'y', 1, 2, mesh, color, sock);
2620 anim_move(
'y', 3, 1, mesh, color, sock);
2622 anim_move(
'y', 3, 3, mesh, color, sock);
2623 anim_move(
'z', 1, 3, mesh, color, sock);
2624 anim_move(
'y', 1, 1, mesh, color, sock);
2626 anim_move(
'y', 1, 3, mesh, color, sock);
2635 anim_move(
'z', 1, 3, mesh, color, sock);
2636 anim_move(
'x', 1, 3, mesh, color, sock);
2637 anim_move(
'z', 1, 1, mesh, color, sock);
2638 anim_move(
'x', 1, 1, mesh, color, sock);
2639 anim_move(
'y', 1, 3, mesh, color, sock);
2640 anim_move(
'x', 1, 1, mesh, color, sock);
2641 anim_move(
'y', 1, 1, mesh, color, sock);
2642 anim_move(
'x', 1, 3, mesh, color, sock);
2645 anim_move(
'x', 1, 3, mesh, color, sock);
2646 anim_move(
'z', 1, 1, mesh, color, sock);
2647 anim_move(
'x', 1, 1, mesh, color, sock);
2648 anim_move(
'y', 1, 3, mesh, color, sock);
2649 anim_move(
'x', 1, 1, mesh, color, sock);
2650 anim_move(
'y', 1, 1, mesh, color, sock);
2651 anim_move(
'x', 1, 3, mesh, color, sock);
2654 anim_move(
'y', 1, 1, mesh, color, sock);
2655 anim_move(
'z', 1, 3, mesh, color, sock);
2656 anim_move(
'y', 1, 3, mesh, color, sock);
2657 anim_move(
'x', 1, 1, mesh, color, sock);
2658 anim_move(
'y', 1, 3, mesh, color, sock);
2659 anim_move(
'x', 1, 3, mesh, color, sock);
2660 anim_move(
'y', 1, 1, mesh, color, sock);
2663 anim_move(
'z', 1, 1, mesh, color, sock);
2664 anim_move(
'y', 1, 1, mesh, color, sock);
2665 anim_move(
'z', 1, 3, mesh, color, sock);
2666 anim_move(
'y', 1, 3, mesh, color, sock);
2667 anim_move(
'x', 1, 1, mesh, color, sock);
2668 anim_move(
'y', 1, 3, mesh, color, sock);
2669 anim_move(
'x', 1, 3, mesh, color, sock);
2670 anim_move(
'y', 1, 1, mesh, color, sock);
2673 anim_move(
'y', 1, 1, mesh, color, sock);
2674 anim_move(
'z', 1, 3, mesh, color, sock);
2675 anim_move(
'y', 1, 3, mesh, color, sock);
2676 anim_move(
'x', 1, 1, mesh, color, sock);
2677 anim_move(
'y', 1, 3, mesh, color, sock);
2678 anim_move(
'x', 1, 3, mesh, color, sock);
2679 anim_move(
'y', 1, 1, mesh, color, sock);
2680 anim_move(
'z', 1, 3, mesh, color, sock);
2681 anim_move(
'y', 1, 1, mesh, color, sock);
2682 anim_move(
'z', 1, 3, mesh, color, sock);
2683 anim_move(
'y', 1, 3, mesh, color, sock);
2684 anim_move(
'x', 1, 1, mesh, color, sock);
2685 anim_move(
'y', 1, 3, mesh, color, sock);
2686 anim_move(
'x', 1, 3, mesh, color, sock);
2687 anim_move(
'y', 1, 1, mesh, color, sock);
2690 anim_move(
'y', 1, 2, mesh, color, sock);
2691 anim_move(
'z', 1, 2, mesh, color, sock);
2692 anim_move(
'y', 1, 2, mesh, color, sock);
2693 anim_move(
'z', 1, 2, mesh, color, sock);
2694 anim_move(
'y', 1, 2, mesh, color, sock);
2697 anim_move(
'y', 3, 3, mesh, color, sock);
2699 anim_move(
'y', 3, 1, mesh, color, sock);
2700 anim_move(
'z', 1, 3, mesh, color, sock);
2701 anim_move(
'y', 1, 1, mesh, color, sock);
2703 anim_move(
'y', 1, 3, mesh, color, sock);
2706 anim_move(
'z', 2, 1, mesh, color, sock);
2707 anim_move(
'x', 1, 2, mesh, color, sock);
2708 anim_move(
'z', 2, 3, mesh, color, sock);
2709 anim_move(
'x', 1, 2, mesh, color, sock);
2724 anim_move(
'z', 1, 1, mesh, color, sock);
2725 anim_move(
'x', 3, 3, mesh, color, sock);
2726 anim_move(
'z', 1, 3, mesh, color, sock);
2727 anim_move(
'x', 3, 1, mesh, color, sock);
2728 anim_move(
'y', 1, 1, mesh, color, sock);
2729 anim_move(
'x', 3, 1, mesh, color, sock);
2730 anim_move(
'y', 1, 3, mesh, color, sock);
2731 anim_move(
'x', 3, 3, mesh, color, sock);
2734 anim_move(
'z', 1, 2, mesh, color, sock);
2735 anim_move(
'x', 3, 3, mesh, color, sock);
2736 anim_move(
'z', 1, 3, mesh, color, sock);
2737 anim_move(
'x', 3, 1, mesh, color, sock);
2738 anim_move(
'y', 1, 1, mesh, color, sock);
2739 anim_move(
'x', 3, 1, mesh, color, sock);
2740 anim_move(
'y', 1, 3, mesh, color, sock);
2741 anim_move(
'x', 3, 3, mesh, color, sock);
2744 anim_move(
'y', 1, 3, mesh, color, sock);
2745 anim_move(
'z', 1, 1, mesh, color, sock);
2746 anim_move(
'y', 1, 1, mesh, color, sock);
2747 anim_move(
'x', 3, 1, mesh, color, sock);
2748 anim_move(
'y', 1, 1, mesh, color, sock);
2749 anim_move(
'x', 3, 3, mesh, color, sock);
2750 anim_move(
'y', 1, 3, mesh, color, sock);
2753 anim_move(
'z', 1, 1, mesh, color, sock);
2754 anim_move(
'y', 1, 3, mesh, color, sock);
2755 anim_move(
'z', 1, 1, mesh, color, sock);
2756 anim_move(
'y', 1, 1, mesh, color, sock);
2757 anim_move(
'x', 3, 1, mesh, color, sock);
2758 anim_move(
'y', 1, 1, mesh, color, sock);
2759 anim_move(
'x', 3, 3, mesh, color, sock);
2760 anim_move(
'y', 1, 3, mesh, color, sock);
2763 anim_move(
'y', 3, 3, mesh, color, sock);
2765 anim_move(
'y', 3, 1, mesh, color, sock);
2766 anim_move(
'z', 1, 3, mesh, color, sock);
2767 anim_move(
'y', 1, 3, mesh, color, sock);
2769 anim_move(
'y', 1, 1, mesh, color, sock);
2772 anim_move(
'z', 2, 1, mesh, color, sock);
2773 anim_move(
'x', 3, 2, mesh, color, sock);
2774 anim_move(
'z', 2, 3, mesh, color, sock);
2775 anim_move(
'x', 3, 2, mesh, color, sock);
2784 anim_move(
'z', 1, 2, mesh, color, sock);
2785 anim_move(
'y', 1, 3, mesh, color, sock);
2786 anim_move(
'z', 1, 1, mesh, color, sock);
2787 anim_move(
'y', 1, 1, mesh, color, sock);
2788 anim_move(
'x', 3, 1, mesh, color, sock);
2789 anim_move(
'y', 1, 1, mesh, color, sock);
2790 anim_move(
'x', 3, 3, mesh, color, sock);
2791 anim_move(
'y', 1, 3, mesh, color, sock);
2794 anim_move(
'z', 1, 3, mesh, color, sock);
2795 anim_move(
'y', 1, 3, mesh, color, sock);
2796 anim_move(
'z', 1, 1, mesh, color, sock);
2797 anim_move(
'y', 1, 1, mesh, color, sock);
2798 anim_move(
'x', 3, 1, mesh, color, sock);
2799 anim_move(
'y', 1, 1, mesh, color, sock);
2800 anim_move(
'x', 3, 3, mesh, color, sock);
2801 anim_move(
'y', 1, 3, mesh, color, sock);
2804 anim_move(
'z', 1, 3, mesh, color, sock);
2805 anim_move(
'x', 3, 3, mesh, color, sock);
2806 anim_move(
'z', 1, 3, mesh, color, sock);
2807 anim_move(
'x', 3, 1, mesh, color, sock);
2808 anim_move(
'y', 1, 1, mesh, color, sock);
2809 anim_move(
'x', 3, 1, mesh, color, sock);
2810 anim_move(
'y', 1, 3, mesh, color, sock);
2811 anim_move(
'x', 3, 3, mesh, color, sock);
2814 anim_move(
'x', 3, 3, mesh, color, sock);
2815 anim_move(
'z', 1, 3, mesh, color, sock);
2816 anim_move(
'x', 3, 1, mesh, color, sock);
2817 anim_move(
'y', 1, 1, mesh, color, sock);
2818 anim_move(
'x', 3, 1, mesh, color, sock);
2819 anim_move(
'y', 1, 3, mesh, color, sock);
2820 anim_move(
'x', 3, 3, mesh, color, sock);
2823 anim_move(
'x', 3, 3, mesh, color, sock);
2824 anim_move(
'z', 1, 3, mesh, color, sock);
2825 anim_move(
'x', 3, 1, mesh, color, sock);
2826 anim_move(
'y', 1, 1, mesh, color, sock);
2827 anim_move(
'x', 3, 1, mesh, color, sock);
2828 anim_move(
'y', 1, 3, mesh, color, sock);
2829 anim_move(
'x', 3, 3, mesh, color, sock);
2830 anim_move(
'z', 1, 3, mesh, color, sock);
2831 anim_move(
'x', 3, 3, mesh, color, sock);
2832 anim_move(
'z', 1, 3, mesh, color, sock);
2833 anim_move(
'x', 3, 1, mesh, color, sock);
2834 anim_move(
'y', 1, 1, mesh, color, sock);
2835 anim_move(
'x', 3, 1, mesh, color, sock);
2836 anim_move(
'y', 1, 3, mesh, color, sock);
2837 anim_move(
'x', 3, 3, mesh, color, sock);
2840 anim_move(
'x', 3, 2, mesh, color, sock);
2841 anim_move(
'z', 1, 2, mesh, color, sock);
2842 anim_move(
'x', 3, 2, mesh, color, sock);
2843 anim_move(
'z', 1, 2, mesh, color, sock);
2844 anim_move(
'x', 3, 2, mesh, color, sock);
2847 anim_move(
'y', 3, 1, mesh, color, sock);
2849 anim_move(
'y', 3, 3, mesh, color, sock);
2850 anim_move(
'z', 1, 3, mesh, color, sock);
2851 anim_move(
'y', 1, 3, mesh, color, sock);
2853 anim_move(
'y', 1, 1, mesh, color, sock);
2868 anim_move(
'y', 3, 3, mesh, color, sock);
2869 anim_move(
'z', 1, 3, mesh, color, sock);
2870 anim_move(
'y', 3, 1, mesh, color, sock);
2871 anim_move(
'x', 3, 3, mesh, color, sock);
2872 anim_move(
'y', 3, 1, mesh, color, sock);
2873 anim_move(
'x', 3, 1, mesh, color, sock);
2874 anim_move(
'y', 3, 3, mesh, color, sock);
2877 anim_move(
'z', 1, 1, mesh, color, sock);
2878 anim_move(
'y', 3, 3, mesh, color, sock);
2879 anim_move(
'z', 1, 3, mesh, color, sock);
2880 anim_move(
'y', 3, 1, mesh, color, sock);
2881 anim_move(
'x', 3, 3, mesh, color, sock);
2882 anim_move(
'y', 3, 1, mesh, color, sock);
2883 anim_move(
'x', 3, 1, mesh, color, sock);
2884 anim_move(
'y', 3, 3, mesh, color, sock);
2887 anim_move(
'z', 1, 3, mesh, color, sock);
2888 anim_move(
'x', 3, 1, mesh, color, sock);
2889 anim_move(
'z', 1, 1, mesh, color, sock);
2890 anim_move(
'x', 3, 3, mesh, color, sock);
2891 anim_move(
'y', 3, 1, mesh, color, sock);
2892 anim_move(
'x', 3, 3, mesh, color, sock);
2893 anim_move(
'y', 3, 3, mesh, color, sock);
2894 anim_move(
'x', 3, 1, mesh, color, sock);
2897 anim_move(
'x', 3, 1, mesh, color, sock);
2898 anim_move(
'z', 1, 1, mesh, color, sock);
2899 anim_move(
'x', 3, 3, mesh, color, sock);
2900 anim_move(
'y', 3, 1, mesh, color, sock);
2901 anim_move(
'x', 3, 3, mesh, color, sock);
2902 anim_move(
'y', 3, 3, mesh, color, sock);
2903 anim_move(
'x', 3, 1, mesh, color, sock);
2906 anim_move(
'y', 3, 1, mesh, color, sock);
2908 anim_move(
'y', 3, 3, mesh, color, sock);
2909 anim_move(
'z', 1, 1, mesh, color, sock);
2910 anim_move(
'y', 3, 3, mesh, color, sock);
2912 anim_move(
'y', 3, 1, mesh, color, sock);
2921 anim_move(
'z', 1, 1, mesh, color, sock);
2922 anim_move(
'x', 3, 1, mesh, color, sock);
2923 anim_move(
'z', 1, 1, mesh, color, sock);
2924 anim_move(
'x', 3, 3, mesh, color, sock);
2925 anim_move(
'y', 3, 1, mesh, color, sock);
2926 anim_move(
'x', 3, 3, mesh, color, sock);
2927 anim_move(
'y', 3, 3, mesh, color, sock);
2928 anim_move(
'x', 3, 1, mesh, color, sock);
2931 anim_move(
'z', 1, 2, mesh, color, sock);
2932 anim_move(
'x', 3, 1, mesh, color, sock);
2933 anim_move(
'z', 1, 1, mesh, color, sock);
2934 anim_move(
'x', 3, 3, mesh, color, sock);
2935 anim_move(
'y', 3, 1, mesh, color, sock);
2936 anim_move(
'x', 3, 3, mesh, color, sock);
2937 anim_move(
'y', 3, 3, mesh, color, sock);
2938 anim_move(
'x', 3, 1, mesh, color, sock);
2941 anim_move(
'z', 1, 2, mesh, color, sock);
2942 anim_move(
'y', 3, 3, mesh, color, sock);
2943 anim_move(
'z', 1, 3, mesh, color, sock);
2944 anim_move(
'y', 3, 1, mesh, color, sock);
2945 anim_move(
'x', 3, 3, mesh, color, sock);
2946 anim_move(
'y', 3, 1, mesh, color, sock);
2947 anim_move(
'x', 3, 1, mesh, color, sock);
2948 anim_move(
'y', 3, 3, mesh, color, sock);
2951 anim_move(
'z', 1, 3, mesh, color, sock);
2952 anim_move(
'y', 3, 3, mesh, color, sock);
2953 anim_move(
'z', 1, 3, mesh, color, sock);
2954 anim_move(
'y', 3, 1, mesh, color, sock);
2955 anim_move(
'x', 3, 3, mesh, color, sock);
2956 anim_move(
'y', 3, 1, mesh, color, sock);
2957 anim_move(
'x', 3, 1, mesh, color, sock);
2958 anim_move(
'y', 3, 3, mesh, color, sock);
2961 anim_move(
'x', 3, 1, mesh, color, sock);
2962 anim_move(
'z', 1, 1, mesh, color, sock);
2963 anim_move(
'x', 3, 3, mesh, color, sock);
2964 anim_move(
'y', 3, 1, mesh, color, sock);
2965 anim_move(
'x', 3, 3, mesh, color, sock);
2966 anim_move(
'y', 3, 3, mesh, color, sock);
2967 anim_move(
'x', 3, 1, mesh, color, sock);
2968 anim_move(
'z', 1, 1, mesh, color, sock);
2969 anim_move(
'x', 3, 1, mesh, color, sock);
2970 anim_move(
'z', 1, 1, mesh, color, sock);
2971 anim_move(
'x', 3, 3, mesh, color, sock);
2972 anim_move(
'y', 3, 1, mesh, color, sock);
2973 anim_move(
'x', 3, 3, mesh, color, sock);
2974 anim_move(
'y', 3, 3, mesh, color, sock);
2975 anim_move(
'x', 3, 1, mesh, color, sock);
2978 anim_move(
'y', 3, 2, mesh, color, sock);
2979 anim_move(
'z', 1, 2, mesh, color, sock);
2980 anim_move(
'y', 3, 2, mesh, color, sock);
2981 anim_move(
'z', 1, 2, mesh, color, sock);
2982 anim_move(
'y', 3, 2, mesh, color, sock);
2997 anim_move(
'z', 1, 3, mesh, color, sock);
2998 anim_move(
'x', 1, 1, mesh, color, sock);
2999 anim_move(
'z', 1, 3, mesh, color, sock);
3000 anim_move(
'x', 1, 3, mesh, color, sock);
3001 anim_move(
'y', 3, 3, mesh, color, sock);
3002 anim_move(
'x', 1, 3, mesh, color, sock);
3003 anim_move(
'y', 3, 1, mesh, color, sock);
3004 anim_move(
'x', 1, 1, mesh, color, sock);
3007 anim_move(
'x', 1, 1, mesh, color, sock);
3008 anim_move(
'z', 1, 3, mesh, color, sock);
3009 anim_move(
'x', 1, 3, mesh, color, sock);
3010 anim_move(
'y', 3, 3, mesh, color, sock);
3011 anim_move(
'x', 1, 3, mesh, color, sock);
3012 anim_move(
'y', 3, 1, mesh, color, sock);
3013 anim_move(
'x', 1, 1, mesh, color, sock);
3016 anim_move(
'z', 1, 2, mesh, color, sock);
3017 anim_move(
'y', 3, 1, mesh, color, sock);
3018 anim_move(
'z', 1, 1, mesh, color, sock);
3019 anim_move(
'y', 3, 3, mesh, color, sock);
3020 anim_move(
'x', 1, 3, mesh, color, sock);
3021 anim_move(
'y', 3, 3, mesh, color, sock);
3022 anim_move(
'x', 1, 1, mesh, color, sock);
3023 anim_move(
'y', 3, 1, mesh, color, sock);
3026 anim_move(
'z', 1, 3, mesh, color, sock);
3027 anim_move(
'y', 3, 1, mesh, color, sock);
3028 anim_move(
'z', 1, 1, mesh, color, sock);
3029 anim_move(
'y', 3, 3, mesh, color, sock);
3030 anim_move(
'x', 1, 3, mesh, color, sock);
3031 anim_move(
'y', 3, 3, mesh, color, sock);
3032 anim_move(
'x', 1, 1, mesh, color, sock);
3033 anim_move(
'y', 3, 1, mesh, color, sock);
3042 anim_move(
'y', 3, 1, mesh, color, sock);
3043 anim_move(
'z', 1, 1, mesh, color, sock);
3044 anim_move(
'y', 3, 3, mesh, color, sock);
3045 anim_move(
'x', 1, 3, mesh, color, sock);
3046 anim_move(
'y', 3, 3, mesh, color, sock);
3047 anim_move(
'x', 1, 1, mesh, color, sock);
3048 anim_move(
'y', 3, 1, mesh, color, sock);
3051 anim_move(
'z', 1, 1, mesh, color, sock);
3052 anim_move(
'y', 3, 1, mesh, color, sock);
3053 anim_move(
'z', 1, 1, mesh, color, sock);
3054 anim_move(
'y', 3, 3, mesh, color, sock);
3055 anim_move(
'x', 1, 3, mesh, color, sock);
3056 anim_move(
'y', 3, 3, mesh, color, sock);
3057 anim_move(
'x', 1, 1, mesh, color, sock);
3058 anim_move(
'y', 3, 1, mesh, color, sock);
3061 anim_move(
'z', 1, 1, mesh, color, sock);
3062 anim_move(
'x', 1, 1, mesh, color, sock);
3063 anim_move(
'z', 1, 3, mesh, color, sock);
3064 anim_move(
'x', 1, 3, mesh, color, sock);
3065 anim_move(
'y', 3, 3, mesh, color, sock);
3066 anim_move(
'x', 1, 3, mesh, color, sock);
3067 anim_move(
'y', 3, 1, mesh, color, sock);
3068 anim_move(
'x', 1, 1, mesh, color, sock);
3071 anim_move(
'z', 1, 2, mesh, color, sock);
3072 anim_move(
'x', 1, 1, mesh, color, sock);
3073 anim_move(
'z', 1, 3, mesh, color, sock);
3074 anim_move(
'x', 1, 3, mesh, color, sock);
3075 anim_move(
'y', 3, 3, mesh, color, sock);
3076 anim_move(
'x', 1, 3, mesh, color, sock);
3077 anim_move(
'y', 3, 1, mesh, color, sock);
3078 anim_move(
'x', 1, 1, mesh, color, sock);
3081 anim_move(
'x', 1, 1, mesh, color, sock);
3082 anim_move(
'z', 1, 3, mesh, color, sock);
3083 anim_move(
'x', 1, 3, mesh, color, sock);
3084 anim_move(
'y', 3, 3, mesh, color, sock);
3085 anim_move(
'x', 1, 3, mesh, color, sock);
3086 anim_move(
'y', 3, 1, mesh, color, sock);
3087 anim_move(
'x', 1, 1, mesh, color, sock);
3088 anim_move(
'z', 1, 3, mesh, color, sock);
3089 anim_move(
'x', 1, 1, mesh, color, sock);
3090 anim_move(
'z', 1, 3, mesh, color, sock);
3091 anim_move(
'x', 1, 3, mesh, color, sock);
3092 anim_move(
'y', 3, 3, mesh, color, sock);
3093 anim_move(
'x', 1, 3, mesh, color, sock);
3094 anim_move(
'y', 3, 1, mesh, color, sock);
3095 anim_move(
'x', 1, 1, mesh, color, sock);
3106 cout <<
"Entering solve_top_edges" << endl;
3116 int i4 = max(l4,-1-l4);
3117 int o4 = (l4 >= 0) ? 0 : 1;
3120 cout <<
"Location of 4-th edge: " << i4
3121 <<
" with orientation " << o4 << endl;
3123 if (i4 < 12 && ((i4 < 4) ||
3124 (i4 > 4 && o4 == 0) ||
3134 int i5 = max(l5,-1-l5);
3135 int o5 = (l5 >= 0) ? 0 : 1;
3138 cout <<
"Location of 5-th edge: " << i5
3139 <<
" with orientation " << o5 << endl;
3141 if (i5 < 12 && ((i5 < 4) ||
3142 (i5 > 5 && o5 == 0) ||
3143 (i5 > 4 && o5 == 1) ))
3152 int i6 = max(l6,-1-l6);
3153 int o6 = (l6 >= 0) ? 0 : 1;
3156 cout <<
"Location of 6-th edge: " << i6
3157 <<
" with orientation " << o6 << endl;
3159 if (i6 < 12 && ((i6 < 4) ||
3160 (i6 > 6 && o6 == 0) ||
3161 (i6 > 5 && o6 == 1) ))
3170 int i7 = max(l7,-1-l7);
3171 int o7 = (l7 >= 0) ? 0 : 1;
3174 cout <<
"Location of 7-th edge: " << i7
3175 <<
" with orientation " << o7 << endl;
3177 if (i7 < 12 && ((i7 < 4) ||
3178 (i7 > 7 && o7 == 0) ||
3179 (i7 > 6 && o7 == 1) ))
3191 cout <<
"Entering solve_mid_edges" << endl;
3201 int i8 = max(l8,-1-l8);
3202 int o8 = (l8 >= 0) ? 0 : 1;
3205 cout <<
"Location of 8-th edge: " << i8
3206 <<
" with orientation " << o8 << endl;
3208 if (i8 >= 4 && i8 < 8)
3210 cout <<
"Moving edges from top tier to middle tier is not supported."
3213 else if (i8 < 12 && ((i8 < 4) ||
3214 (i8 > 8 && o8 == 0) ||
3215 (i8 > 7 && o8 == 1) ))
3224 int i9 = max(l9,-1-l9);
3225 int o9 = (l9 >= 0) ? 0 : 1;
3228 cout <<
"Location of 9-th edge: " << i9
3229 <<
" with orientation " << o9 << endl;
3231 if (i9 >= 4 && i9 < 8)
3233 cout <<
"Moving edges from top tier to middle tier is not supported."
3236 else if (i9 < 12 && ((i9 < 4) ||
3237 (i9 > 9 && o9 == 0) ||
3238 (i9 > 8 && o9 == 1) ))
3247 int i10 = max(l10,-1-l10);
3248 int o10 = (l10 >= 0) ? 0 : 1;
3251 cout <<
"Location of 10-th edge: " << i10
3252 <<
" with orientation " << o10 << endl;
3254 if (i10 >= 4 && i10 < 8)
3256 cout <<
"Moving edges from top tier to middle tier is not supported."
3259 else if (i10 < 12 && ((i10 < 4) ||
3260 (i10 > 10 && o10 == 0) ||
3261 (i10 > 9 && o10 == 1) ))
3270 int i11 = max(l11,-1-l11);
3271 int o11 = (l11 >= 0) ? 0 : 1;
3274 cout <<
"Location of 11-th edge: " << i11
3275 <<
" with orientation " << o11 << endl;
3277 if (i11 >= 4 && i11 < 8)
3279 cout <<
"Moving edges from top tier to middle tier is not supported."
3282 else if (i11 < 12 && ((i11 < 4) ||
3283 (i11 > 11 && o11 == 0) ||
3284 (i11 > 10 && o11 == 1) ))
3297 cout <<
"Entering swap_corners" << endl;
3304 for (
int i=0; i<8; i++)
3306 if ((rubik.corn_[3 * i] == c0[0] &&
3307 rubik.corn_[3 * i + 1] == c0[1] &&
3308 rubik.corn_[3 * i + 2] == c0[2]) ||
3309 (rubik.corn_[3 * i] == c0[1] &&
3310 rubik.corn_[3 * i + 1] == c0[2] &&
3311 rubik.corn_[3 * i + 2] == c0[0]) ||
3312 (rubik.corn_[3 * i] == c0[2] &&
3313 rubik.corn_[3 * i + 1] == c0[0] &&
3314 rubik.corn_[3 * i + 2] == c0[1]) ||
3315 (rubik.corn_[3 * i] == c0[2] &&
3316 rubik.corn_[3 * i + 1] == c0[1] &&
3317 rubik.corn_[3 * i + 2] == c0[0]) ||
3318 (rubik.corn_[3 * i] == c0[1] &&
3319 rubik.corn_[3 * i + 1] == c0[0] &&
3320 rubik.corn_[3 * i + 2] == c0[2]) ||
3321 (rubik.corn_[3 * i] == c0[0] &&
3322 rubik.corn_[3 * i + 1] == c0[2] &&
3323 rubik.corn_[3 * i + 2] == c0[1]))
3331 cout <<
"Location of c0 = {"<<c0[0]<<
","<<c0[1]<<
","<<c0[2]<<
"}: "
3343 anim_move(
'z', 1, i0, mesh, color, sock);
3345 anim_move(
'z', 1, 4-i0, mesh, color, sock);
3348 anim_move(
'x', 1, 3, mesh, color, sock);
3350 anim_move(
'x', 1, 1, mesh, color, sock);
3353 anim_move(
'y', 1, 2, mesh, color, sock);
3355 anim_move(
'y', 1, 2, mesh, color, sock);
3358 anim_move(
'z', 3, 2, mesh, color, sock);
3359 anim_move(
'x', 1, 3, mesh, color, sock);
3361 anim_move(
'x', 1, 1, mesh, color, sock);
3362 anim_move(
'z', 3, 2, mesh, color, sock);
3365 anim_move(
'x', 1, 2, mesh, color, sock);
3367 anim_move(
'x', 1, 2, mesh, color, sock);
3371 else if (c1 != NULL)
3375 for (
int i=1; i<8; i++)
3377 if ((rubik.corn_[3 * i] == c1[0] &&
3378 rubik.corn_[3 * i + 1] == c1[1] &&
3379 rubik.corn_[3 * i + 2] == c1[2]) ||
3380 (rubik.corn_[3 * i] == c1[1] &&
3381 rubik.corn_[3 * i + 1] == c1[2] &&
3382 rubik.corn_[3 * i + 2] == c1[0]) ||
3383 (rubik.corn_[3 * i] == c1[2] &&
3384 rubik.corn_[3 * i + 1] == c1[0] &&
3385 rubik.corn_[3 * i + 2] == c1[1]) ||
3386 (rubik.corn_[3 * i] == c1[2] &&
3387 rubik.corn_[3 * i + 1] == c1[1] &&
3388 rubik.corn_[3 * i + 2] == c1[0]) ||
3389 (rubik.corn_[3 * i] == c1[1] &&
3390 rubik.corn_[3 * i + 1] == c1[0] &&
3391 rubik.corn_[3 * i + 2] == c1[2]) ||
3392 (rubik.corn_[3 * i] == c1[0] &&
3393 rubik.corn_[3 * i + 1] == c1[2] &&
3394 rubik.corn_[3 * i + 2] == c1[1]))
3402 cout <<
"Location of piece belonging at " << 0 <<
" (c1) is "
3412 anim_move(
'x', 3, 1, mesh, color, sock);
3414 anim_move(
'x', 3, 3, mesh, color, sock);
3417 anim_move(
'y', 3, 1, mesh, color, sock);
3418 anim_move(
'x', 3, 1, mesh, color, sock);
3420 anim_move(
'x', 3, 3, mesh, color, sock);
3421 anim_move(
'y', 3, 3, mesh, color, sock);
3424 anim_move(
'z', 3, 3, mesh, color, sock);
3425 anim_move(
'x', 3, 3, mesh, color, sock);
3427 anim_move(
'x', 3, 1, mesh, color, sock);
3428 anim_move(
'z', 3, 1, mesh, color, sock);
3431 anim_move(
'x', 3, 3, mesh, color, sock);
3433 anim_move(
'x', 3, 1, mesh, color, sock);
3436 anim_move(
'x', 3, 2, mesh, color, sock);
3438 anim_move(
'x', 3, 2, mesh, color, sock);
3441 anim_move(
'z', 3, 2, mesh, color, sock);
3442 anim_move(
'x', 3, 3, mesh, color, sock);
3444 anim_move(
'x', 3, 1, mesh, color, sock);
3445 anim_move(
'z', 3, 2, mesh, color, sock);
3451 anim_move(
'x', 3, 3, mesh, color, sock);
3452 anim_move(
'z', 1, 1, mesh, color, sock);
3453 anim_move(
'x', 3, 1, mesh, color, sock);
3454 anim_move(
'y', 1, 3, mesh, color, sock);
3455 anim_move(
'z', 1, 3, mesh, color, sock);
3456 anim_move(
'y', 1, 1, mesh, color, sock);
3457 anim_move(
'x', 3, 3, mesh, color, sock);
3458 anim_move(
'z', 1, 3, mesh, color, sock);
3459 anim_move(
'x', 3, 1, mesh, color, sock);
3460 anim_move(
'z', 1, 2, mesh, color, sock);
3469 cout <<
"Entering solve_corner_locations" << endl;
3478 for (
int i=0; i<8; i++)
3480 if (!((rubik.corn_[3 * i + 0] == corn_colors_[3 * i + 0] &&
3481 rubik.corn_[3 * i + 1] == corn_colors_[3 * i + 1] &&
3482 rubik.corn_[3 * i + 2] == corn_colors_[3 * i + 2]) ||
3483 (rubik.corn_[3 * i + 0] == corn_colors_[3 * i + 1] &&
3484 rubik.corn_[3 * i + 1] == corn_colors_[3 * i + 2] &&
3485 rubik.corn_[3 * i + 2] == corn_colors_[3 * i + 0]) ||
3486 (rubik.corn_[3 * i + 0] == corn_colors_[3 * i + 2] &&
3487 rubik.corn_[3 * i + 1] == corn_colors_[3 * i + 0] &&
3488 rubik.corn_[3 * i + 2] == corn_colors_[3 * i + 1]) ||
3489 (rubik.corn_[3 * i + 0] == corn_colors_[3 * i + 2] &&
3490 rubik.corn_[3 * i + 1] == corn_colors_[3 * i + 1] &&
3491 rubik.corn_[3 * i + 2] == corn_colors_[3 * i + 0]) ||
3492 (rubik.corn_[3 * i + 0] == corn_colors_[3 * i + 1] &&
3493 rubik.corn_[3 * i + 1] == corn_colors_[3 * i + 0] &&
3494 rubik.corn_[3 * i + 2] == corn_colors_[3 * i + 2]) ||
3495 (rubik.corn_[3 * i + 0] == corn_colors_[3 * i + 0] &&
3496 rubik.corn_[3 * i + 1] == corn_colors_[3 * i + 2] &&
3497 rubik.corn_[3 * i + 2] == corn_colors_[3 * i + 1])))
3505 cout <<
"First incorrectly filled corner location: " << i0 << endl;
3508 if (i0 < 0) {
return; }
3515 cout <<
"Location of piece belonging at " << i0 <<
" is " << i1 << endl;
3520 cout <<
"Invalid configuration of corners" << endl;
3524 int c0[3] = {rubik.corn_[3 * i0],
3525 rubik.corn_[3 * i0 + 1],
3526 rubik.corn_[3 * i0 + 2]
3528 int c1[3] = {rubik.corn_[3 * i1],
3529 rubik.corn_[3 * i1 + 1],
3530 rubik.corn_[3 * i1 + 2]
3544 cout <<
"Entering solve_bot_corner_locations" << endl;
3557 cout <<
"Location of piece belonging at 0 is " << i0 << endl;
3561 anim_move(
'z', 1, i0, mesh, color, sock);
3571 cout <<
"Location of piece belonging at 1 is " << i1 << endl;
3576 cout <<
"Invalid configuration of corners" << endl;
3582 anim_move(
'y', 3, 3, mesh, color, sock);
3583 anim_move(
'z', 1, 1, mesh, color, sock);
3584 anim_move(
'y', 3, 1, mesh, color, sock);
3585 anim_move(
'x', 3, 1, mesh, color, sock);
3586 anim_move(
'z', 1, 3, mesh, color, sock);
3587 anim_move(
'x', 3, 3, mesh, color, sock);
3588 anim_move(
'y', 3, 3, mesh, color, sock);
3589 anim_move(
'z', 1, 3, mesh, color, sock);
3590 anim_move(
'y', 3, 1, mesh, color, sock);
3591 anim_move(
'z', 1, 2, mesh, color, sock);
3594 anim_move(
'y', 3, 3, mesh, color, sock);
3595 anim_move(
'z', 1, 1, mesh, color, sock);
3596 anim_move(
'y', 3, 1, mesh, color, sock);
3597 anim_move(
'x', 3, 1, mesh, color, sock);
3598 anim_move(
'z', 1, 2, mesh, color, sock);
3599 anim_move(
'x', 3, 3, mesh, color, sock);
3600 anim_move(
'y', 3, 3, mesh, color, sock);
3601 anim_move(
'z', 1, 3, mesh, color, sock);
3602 anim_move(
'y', 3, 1, mesh, color, sock);
3603 anim_move(
'z', 1, 3, mesh, color, sock);
3614 cout <<
"Location of piece belonging at 2 is " << i2 << endl;
3619 cout <<
"Invalid configuration of corners" << endl;
3624 anim_move(
'x', 1, 1, mesh, color, sock);
3625 anim_move(
'z', 1, 1, mesh, color, sock);
3626 anim_move(
'x', 1, 3, mesh, color, sock);
3627 anim_move(
'y', 3, 1, mesh, color, sock);
3628 anim_move(
'z', 1, 3, mesh, color, sock);
3629 anim_move(
'y', 3, 3, mesh, color, sock);
3630 anim_move(
'x', 1, 1, mesh, color, sock);
3631 anim_move(
'z', 1, 3, mesh, color, sock);
3632 anim_move(
'x', 1, 3, mesh, color, sock);
3633 anim_move(
'z', 1, 2, mesh, color, sock);
3640 bool cw,
int * c0,
int * c1,
int * c2)
3646 for (
int i=0; i<8; i++)
3648 if ((rubik.corn_[3 * i] == c0[0] &&
3649 rubik.corn_[3 * i + 1] == c0[1] &&
3650 rubik.corn_[3 * i + 2] == c0[2]) ||
3651 (rubik.corn_[3 * i] == c0[1] &&
3652 rubik.corn_[3 * i + 1] == c0[2] &&
3653 rubik.corn_[3 * i + 2] == c0[0]) ||
3654 (rubik.corn_[3 * i] == c0[2] &&
3655 rubik.corn_[3 * i + 1] == c0[0] &&
3656 rubik.corn_[3 * i + 2] == c0[1]) ||
3657 (rubik.corn_[3 * i] == c0[2] &&
3658 rubik.corn_[3 * i + 1] == c0[1] &&
3659 rubik.corn_[3 * i + 2] == c0[0]) ||
3660 (rubik.corn_[3 * i] == c0[1] &&
3661 rubik.corn_[3 * i + 1] == c0[0] &&
3662 rubik.corn_[3 * i + 2] == c0[2]) ||
3663 (rubik.corn_[3 * i] == c0[0] &&
3664 rubik.corn_[3 * i + 1] == c0[2] &&
3665 rubik.corn_[3 * i + 2] == c0[1]))
3673 cout <<
"Location of c0 = {"<<c0[0]<<
","<<c0[1]<<
","<<c0[2]<<
"}: "
3685 anim_move(
'z', 1, i0, mesh, color, sock);
3687 anim_move(
'z', 1, 4-i0, mesh, color, sock);
3690 anim_move(
'x', 1, 3, mesh, color, sock);
3692 anim_move(
'x', 1, 1, mesh, color, sock);
3695 anim_move(
'y', 1, 2, mesh, color, sock);
3697 anim_move(
'y', 1, 2, mesh, color, sock);
3700 anim_move(
'z', 3, 2, mesh, color, sock);
3701 anim_move(
'x', 1, 3, mesh, color, sock);
3703 anim_move(
'x', 1, 1, mesh, color, sock);
3704 anim_move(
'z', 3, 2, mesh, color, sock);
3707 anim_move(
'x', 1, 2, mesh, color, sock);
3709 anim_move(
'x', 1, 2, mesh, color, sock);
3714 else if (c1 != NULL)
3718 for (
int i=1; i<8; i++)
3720 if ((rubik.corn_[3 * i] == c1[0] &&
3721 rubik.corn_[3 * i + 1] == c1[1] &&
3722 rubik.corn_[3 * i + 2] == c1[2]) ||
3723 (rubik.corn_[3 * i] == c1[1] &&
3724 rubik.corn_[3 * i + 1] == c1[2] &&
3725 rubik.corn_[3 * i + 2] == c1[0]) ||
3726 (rubik.corn_[3 * i] == c1[2] &&
3727 rubik.corn_[3 * i + 1] == c1[0] &&
3728 rubik.corn_[3 * i + 2] == c1[1]) ||
3729 (rubik.corn_[3 * i] == c1[2] &&
3730 rubik.corn_[3 * i + 1] == c1[1] &&
3731 rubik.corn_[3 * i + 2] == c1[0]) ||
3732 (rubik.corn_[3 * i] == c1[1] &&
3733 rubik.corn_[3 * i + 1] == c1[0] &&
3734 rubik.corn_[3 * i + 2] == c1[2]) ||
3735 (rubik.corn_[3 * i] == c1[0] &&
3736 rubik.corn_[3 * i + 1] == c1[2] &&
3737 rubik.corn_[3 * i + 2] == c1[1]))
3745 cout <<
"Location of c1 = {"<<c1[0]<<
","<<c1[1]<<
","<<c1[2]<<
"}: "
3757 anim_move(
'x', 3, 1, mesh, color, sock);
3759 anim_move(
'x', 3, 3, mesh, color, sock);
3762 anim_move(
'y', 3, 1, mesh, color, sock);
3763 anim_move(
'x', 3, 1, mesh, color, sock);
3765 anim_move(
'x', 3, 3, mesh, color, sock);
3766 anim_move(
'y', 3, 3, mesh, color, sock);
3769 anim_move(
'z', 3, 3, mesh, color, sock);
3770 anim_move(
'x', 3, 3, mesh, color, sock);
3772 anim_move(
'x', 3, 1, mesh, color, sock);
3773 anim_move(
'z', 3, 1, mesh, color, sock);
3776 anim_move(
'x', 3, 3, mesh, color, sock);
3778 anim_move(
'x', 3, 1, mesh, color, sock);
3781 anim_move(
'x', 3, 2, mesh, color, sock);
3783 anim_move(
'x', 3, 2, mesh, color, sock);
3786 anim_move(
'z', 3, 2, mesh, color, sock);
3787 anim_move(
'x', 3, 3, mesh, color, sock);
3789 anim_move(
'x', 3, 1, mesh, color, sock);
3790 anim_move(
'z', 3, 2, mesh, color, sock);
3802 anim_move(
'y', 3, 3, mesh, color, sock);
3804 anim_move(
'y', 3, 1, mesh, color, sock);
3807 anim_move(
'x', 3, 3, mesh, color, sock);
3808 anim_move(
'y', 3, 3, mesh, color, sock);
3810 anim_move(
'y', 3, 1, mesh, color, sock);
3811 anim_move(
'x', 3, 1, mesh, color, sock);
3814 anim_move(
'z', 3, 1, mesh, color, sock);
3815 anim_move(
'y', 3, 1, mesh, color, sock);
3817 anim_move(
'y', 3, 3, mesh, color, sock);
3818 anim_move(
'z', 3, 3, mesh, color, sock);
3821 anim_move(
'z', 3, 2, mesh, color, sock);
3822 anim_move(
'y', 3, 1, mesh, color, sock);
3824 anim_move(
'y', 3, 3, mesh, color, sock);
3825 anim_move(
'z', 3, 2, mesh, color, sock);
3828 anim_move(
'y', 3, 2, mesh, color, sock);
3830 anim_move(
'y', 3, 2, mesh, color, sock);
3833 anim_move(
'y', 3, 1, mesh, color, sock);
3835 anim_move(
'y', 3, 3, mesh, color, sock);
3840 else if (c2 != NULL)
3844 for (
int i=2; i<8; i++)
3846 if ((rubik.corn_[3 * i] == c2[0] &&
3847 rubik.corn_[3 * i + 1] == c2[1] &&
3848 rubik.corn_[3 * i + 2] == c2[2]) ||
3849 (rubik.corn_[3 * i] == c2[1] &&
3850 rubik.corn_[3 * i + 1] == c2[2] &&
3851 rubik.corn_[3 * i + 2] == c2[0]) ||
3852 (rubik.corn_[3 * i] == c2[2] &&
3853 rubik.corn_[3 * i + 1] == c2[0] &&
3854 rubik.corn_[3 * i + 2] == c2[1]) ||
3855 (rubik.corn_[3 * i] == c2[2] &&
3856 rubik.corn_[3 * i + 1] == c2[1] &&
3857 rubik.corn_[3 * i + 2] == c2[0]) ||
3858 (rubik.corn_[3 * i] == c2[1] &&
3859 rubik.corn_[3 * i + 1] == c2[0] &&
3860 rubik.corn_[3 * i + 2] == c2[2]) ||
3861 (rubik.corn_[3 * i] == c2[0] &&
3862 rubik.corn_[3 * i + 1] == c2[2] &&
3863 rubik.corn_[3 * i + 2] == c2[1]))
3871 cout <<
"Location of c2 = {"<<c2[0]<<
","<<c2[1]<<
","<<c2[2]<<
"}: "
3881 anim_move(
'y', 3, 1, mesh, color, sock);
3883 anim_move(
'y', 3, 3, mesh, color, sock);
3886 anim_move(
'z', 3, 2, mesh, color, sock);
3887 anim_move(
'y', 3, 3, mesh, color, sock);
3889 anim_move(
'y', 3, 1, mesh, color, sock);
3890 anim_move(
'z', 3, 2, mesh, color, sock);
3893 anim_move(
'z', 3, 3, mesh, color, sock);
3894 anim_move(
'y', 3, 3, mesh, color, sock);
3896 anim_move(
'y', 3, 1, mesh, color, sock);
3897 anim_move(
'z', 3, 1, mesh, color, sock);
3900 anim_move(
'y', 3, 3, mesh, color, sock);
3902 anim_move(
'y', 3, 1, mesh, color, sock);
3905 anim_move(
'y', 3, 2, mesh, color, sock);
3907 anim_move(
'y', 3, 2, mesh, color, sock);
3917 cout <<
"twist_corners performing clockwise twist" << endl;
3919 anim_move(
'x', 3, 1, mesh, color, sock);
3920 anim_move(
'z', 1, 3, mesh, color, sock);
3921 anim_move(
'x', 3, 3, mesh, color, sock);
3922 anim_move(
'z', 1, 3, mesh, color, sock);
3923 anim_move(
'x', 3, 1, mesh, color, sock);
3924 anim_move(
'z', 1, 2, mesh, color, sock);
3925 anim_move(
'x', 3, 3, mesh, color, sock);
3926 anim_move(
'z', 1, 2, mesh, color, sock);
3932 cout <<
"twist_corners performing counter-clockwise twist" << endl;
3934 anim_move(
'y', 1, 1, mesh, color, sock);
3935 anim_move(
'z', 1, 1, mesh, color, sock);
3936 anim_move(
'y', 1, 3, mesh, color, sock);
3937 anim_move(
'z', 1, 1, mesh, color, sock);
3938 anim_move(
'y', 1, 1, mesh, color, sock);
3939 anim_move(
'z', 1, 2, mesh, color, sock);
3940 anim_move(
'y', 1, 3, mesh, color, sock);
3941 anim_move(
'z', 1, 2, mesh, color, sock);
3952 cout <<
"Entering solve_corner_orientations" << endl;
3962 for (
int i=0; i<8; i++)
3964 if (rubik.corn_[3 * i + 0] != corn_colors_[3 * i + 0])
3973 cw = rubik.corn_[3 * i0 + 0] == corn_colors_[3 * i0 + 1];
3979 cw = rubik.corn_[3 * i0 + 0] == corn_colors_[3 * i0 + 2];
3986 if (i0 < 0) {
return; }
3990 cout <<
"First incorrectly oriented corner: " << i0 << endl;
3995 for (
int i=i0+1; i<8; i++)
3997 if (rubik.corn_[3 * i + 0] != corn_colors_[3 * i + 0])
4005 cout <<
"Second incorrectly oriented corner: " << i1 << endl;
4011 for (
int i=i1+1; i<8; i++)
4013 if (rubik.corn_[3 * i + 0] != corn_colors_[3 * i + 0])
4023 cout <<
"Third incorrectly oriented corner: " << i2 << endl;
4027 int c0[3] = {rubik.corn_[3 * i0],
4028 rubik.corn_[3 * i0 + 1],
4029 rubik.corn_[3 * i0 + 2]
4031 int c1[3] = {rubik.corn_[3 * i1],
4032 rubik.corn_[3 * i1 + 1],
4033 rubik.corn_[3 * i1 + 2]
4035 int c2[3] = {rubik.corn_[3 * i2],
4036 rubik.corn_[3 * i2 + 1],
4037 rubik.corn_[3 * i2 + 2]
4045 int c0[3] = {rubik.corn_[3 * i0],
4046 rubik.corn_[3 * i0 + 1],
4047 rubik.corn_[3 * i0 + 2]
4049 int c1[3] = {rubik.corn_[3 * i1],
4050 rubik.corn_[3 * i1 + 1],
4051 rubik.corn_[3 * i1 + 2]
4061 int * e0,
int * e1,
int * e2)
4065 cout <<
"Entering permute_edges" << endl;
4072 for (
int i=0; i<12; i++)
4074 if ((rubik.edge_[2 * i] == e0[0] &&
4075 rubik.edge_[2 * i + 1] == e0[1]) ||
4076 (rubik.edge_[2 * i] == e0[1] &&
4077 rubik.edge_[2 * i + 1] == e0[0]))
4085 cout <<
"Location of e0 = {"<<e0[0]<<
","<<e0[1]<<
"}: " << i0 << endl;
4096 anim_move(
'z', 1, i0, mesh, color, sock);
4098 anim_move(
'z', 1, 4-i0, mesh, color, sock);
4101 anim_move(
'x', 2, 3, mesh, color, sock);
4103 anim_move(
'x', 2, 1, mesh, color, sock);
4106 anim_move(
'y', 2, 3, mesh, color, sock);
4108 anim_move(
'y', 2, 1, mesh, color, sock);
4111 anim_move(
'x', 2, 2, mesh, color, sock);
4113 anim_move(
'x', 2, 2, mesh, color, sock);
4116 anim_move(
'y', 2, 1, mesh, color, sock);
4118 anim_move(
'y', 2, 3, mesh, color, sock);
4121 anim_move(
'y', 1, 1, mesh, color, sock);
4123 anim_move(
'y', 1, 3, mesh, color, sock);
4126 anim_move(
'y', 1, 3, mesh, color, sock);
4128 anim_move(
'y', 1, 1, mesh, color, sock);
4131 anim_move(
'x', 3, 1, mesh, color, sock);
4133 anim_move(
'x', 3, 3, mesh, color, sock);
4136 anim_move(
'x', 1, 1, mesh, color, sock);
4138 anim_move(
'x', 1, 3, mesh, color, sock);
4142 else if (e1 != NULL)
4146 for (
int i=1; i<12; i++)
4148 if ((rubik.edge_[2 * i] == e1[0] &&
4149 rubik.edge_[2 * i + 1] == e1[1]) ||
4150 (rubik.edge_[2 * i] == e1[1] &&
4151 rubik.edge_[2 * i + 1] == e1[0]))
4159 cout <<
"Location of piece belonging at " << 0 <<
" (e1) is "
4170 anim_move(
'y', 1, 1, mesh, color, sock);
4171 anim_move(
'z', 1, i1-1, mesh, color, sock);
4172 anim_move(
'y', 1, 3, mesh, color, sock);
4174 anim_move(
'y', 1, 1, mesh, color, sock);
4175 anim_move(
'z', 1, 5-i1, mesh, color, sock);
4176 anim_move(
'y', 1, 3, mesh, color, sock);
4182 anim_move(
'z', 3, (i1-1)%4, mesh, color, sock);
4183 anim_move(
'x', 3, 2, mesh, color, sock);
4185 anim_move(
'x', 3, 2, mesh, color, sock);
4186 anim_move(
'z', 3, (9-i1)%4, mesh, color, sock);
4192 anim_move(
'z', 2, (i1-5)%4, mesh, color, sock);
4193 anim_move(
'x', 3, 3, mesh, color, sock);
4195 anim_move(
'x', 3, 1, mesh, color, sock);
4196 anim_move(
'z', 2, (13-i1)%4, mesh, color, sock);
4200 else if (e2 != NULL)
4204 for (
int i=2; i<12; i++)
4206 if ((rubik.edge_[2 * i] == e2[0] &&
4207 rubik.edge_[2 * i + 1] == e2[1]) ||
4208 (rubik.edge_[2 * i] == e2[1] &&
4209 rubik.edge_[2 * i + 1] == e2[0]))
4217 cout <<
"Location of e2: " << i2 << endl;
4226 anim_move(
'x', 1, 3, mesh, color, sock);
4227 anim_move(
'y', 3, 1, mesh, color, sock);
4229 anim_move(
'y', 3, 3, mesh, color, sock);
4230 anim_move(
'x', 1, 1, mesh, color, sock);
4236 anim_move(
'z', 3, (i2-2)%4, mesh, color, sock);
4237 anim_move(
'y', 3, 2, mesh, color, sock);
4239 anim_move(
'y', 3, 2, mesh, color, sock);
4240 anim_move(
'z', 3, (10-i2)%4, mesh, color, sock);
4246 anim_move(
'z', 2, (i2-6)%4, mesh, color, sock);
4247 anim_move(
'y', 3, 3, mesh, color, sock);
4249 anim_move(
'y', 3, 1, mesh, color, sock);
4250 anim_move(
'z', 2, (14-i2)%4, mesh, color, sock);
4265 anim_move(
'y', 2, 1, mesh, color, sock);
4266 anim_move(
'z', 1, 1, mesh, color, sock);
4267 anim_move(
'y', 2, 3, mesh, color, sock);
4268 anim_move(
'z', 1, 2, mesh, color, sock);
4269 anim_move(
'y', 2, 1, mesh, color, sock);
4270 anim_move(
'z', 1, 1, mesh, color, sock);
4271 anim_move(
'y', 2, 3, mesh, color, sock);
4275 anim_move(
'y', 2, 1, mesh, color, sock);
4276 anim_move(
'z', 1, 3, mesh, color, sock);
4277 anim_move(
'y', 2, 3, mesh, color, sock);
4278 anim_move(
'z', 1, 2, mesh, color, sock);
4279 anim_move(
'y', 2, 1, mesh, color, sock);
4280 anim_move(
'z', 1, 3, mesh, color, sock);
4281 anim_move(
'y', 2, 3, mesh, color, sock);
4290 cout <<
"Entering solve_edge_locations" << endl;
4299 for (
int i=0; i<12; i++)
4301 if (!((rubik.edge_[2 * i] == edge_colors_[2 * i] &&
4302 rubik.edge_[2 * i + 1] == edge_colors_[2 * i + 1]) ||
4303 (rubik.edge_[2 * i] == edge_colors_[2 * i + 1] &&
4304 rubik.edge_[2 * i + 1] == edge_colors_[2 * i])))
4312 cout <<
"First incorrectly filled edge location: " << i0 << endl;
4315 if (i0 < 0) {
return; }
4319 if (i1 < 0 ) { i1 = -1 - i1; }
4322 cout <<
"Location of piece belonging at " << i0 <<
" is " << i1 << endl;
4327 for (
int i=i0+1; i<12; i++)
4329 if (i == i1) {
continue; }
4330 if (!((rubik.edge_[2 * i + 0] == edge_colors_[2 * i + 0] &&
4331 rubik.edge_[2 * i + 1] == edge_colors_[2 * i + 1]) ||
4332 (rubik.edge_[2 * i + 0] == edge_colors_[2 * i + 1] &&
4333 rubik.edge_[2 * i + 1] == edge_colors_[2 * i + 0])))
4341 cout <<
"Another incorrectly filled edge location: " << i2 << endl;
4344 if (i1 < 0 || i2 <0)
4346 cout <<
"Invalid configuration of edges" << endl;
4350 int e0[2] = {rubik.edge_[2 * i0], rubik.edge_[2 * i0 + 1]};
4351 int e1[2] = {rubik.edge_[2 * i1], rubik.edge_[2 * i1 + 1]};
4352 int e2[2] = {rubik.edge_[2 * i2], rubik.edge_[2 * i2 + 1]};
4361 int n,
int * e0,
int * e1,
int * e2,
int * e3)
4369 for (
int i=0; i<12; i++)
4371 if ((rubik.edge_[2 * i] == e0[0] &&
4372 rubik.edge_[2 * i + 1] == e0[1]) ||
4373 (rubik.edge_[2 * i] == e0[1] &&
4374 rubik.edge_[2 * i + 1] == e0[0]))
4382 cout <<
"Location of e0 = {"<<e0[0]<<
","<<e0[1]<<
"}: " << i0 << endl;
4393 anim_move(
'z', 1, i0, mesh, color, sock);
4395 anim_move(
'z', 1, 4-i0, mesh, color, sock);
4398 anim_move(
'x', 2, 3, mesh, color, sock);
4400 anim_move(
'x', 2, 1, mesh, color, sock);
4403 anim_move(
'y', 2, 3, mesh, color, sock);
4405 anim_move(
'y', 2, 1, mesh, color, sock);
4408 anim_move(
'x', 2, 2, mesh, color, sock);
4410 anim_move(
'x', 2, 2, mesh, color, sock);
4413 anim_move(
'y', 2, 1, mesh, color, sock);
4415 anim_move(
'y', 2, 3, mesh, color, sock);
4418 anim_move(
'y', 1, 1, mesh, color, sock);
4420 anim_move(
'y', 1, 3, mesh, color, sock);
4423 anim_move(
'y', 1, 3, mesh, color, sock);
4425 anim_move(
'y', 1, 1, mesh, color, sock);
4428 anim_move(
'x', 3, 1, mesh, color, sock);
4430 anim_move(
'x', 3, 3, mesh, color, sock);
4433 anim_move(
'x', 1, 1, mesh, color, sock);
4435 anim_move(
'x', 1, 3, mesh, color, sock);
4439 else if (e1 != NULL)
4443 for (
int i=1; i<12; i++)
4445 if ((rubik.edge_[2 * i] == e1[0] &&
4446 rubik.edge_[2 * i + 1] == e1[1]) ||
4447 (rubik.edge_[2 * i] == e1[1] &&
4448 rubik.edge_[2 * i + 1] == e1[0]))
4456 cout <<
"Location of e1: " << i1 << endl;
4462 anim_move(
'x', 3, 3, mesh, color, sock);
4463 anim_move(
'y', 3, 3, mesh, color, sock);
4464 flip_edges(mesh, color, sock, 2, NULL, NULL);
4465 anim_move(
'y', 3, 1, mesh, color, sock);
4466 anim_move(
'x', 3, 1, mesh, color, sock);
4469 flip_edges(mesh, color, sock, 2, NULL, NULL);
4472 anim_move(
'x', 1, 3, mesh, color, sock);
4473 anim_move(
'y', 3, 1, mesh, color, sock);
4474 flip_edges(mesh, color, sock, 2, NULL, NULL);
4475 anim_move(
'y', 3, 3, mesh, color, sock);
4476 anim_move(
'x', 1, 1, mesh, color, sock);
4482 anim_move(
'z', 3, (i1-2)%4, mesh, color, sock);
4483 anim_move(
'y', 3, 2, mesh, color, sock);
4484 flip_edges(mesh, color, sock, 2, NULL, NULL);
4485 anim_move(
'y', 3, 2, mesh, color, sock);
4486 anim_move(
'z', 3, (10-i1)%4, mesh, color, sock);
4492 anim_move(
'z', 2, (i1-6)%4, mesh, color, sock);
4493 anim_move(
'y', 3, 3, mesh, color, sock);
4494 flip_edges(mesh, color, sock, 2, NULL, NULL);
4495 anim_move(
'y', 3, 1, mesh, color, sock);
4496 anim_move(
'z', 2, (14-i1)%4, mesh, color, sock);
4502 anim_move(
'x', 2, 3, mesh, color, sock);
4503 anim_move(
'z', 1, 3, mesh, color, sock);
4504 anim_move(
'x', 2, 1, mesh, color, sock);
4505 anim_move(
'z', 1, 3, mesh, color, sock);
4506 anim_move(
'x', 2, 3, mesh, color, sock);
4507 anim_move(
'z', 1, 3, mesh, color, sock);
4508 anim_move(
'x', 2, 1, mesh, color, sock);
4509 anim_move(
'z', 1, 3, mesh, color, sock);
4510 anim_move(
'x', 2, 3, mesh, color, sock);
4511 anim_move(
'z', 1, 2, mesh, color, sock);
4512 anim_move(
'x', 2, 1, mesh, color, sock);
4513 anim_move(
'z', 1, 3, mesh, color, sock);
4514 anim_move(
'x', 2, 3, mesh, color, sock);
4515 anim_move(
'z', 1, 3, mesh, color, sock);
4516 anim_move(
'x', 2, 1, mesh, color, sock);
4517 anim_move(
'z', 1, 3, mesh, color, sock);
4518 anim_move(
'x', 2, 3, mesh, color, sock);
4519 anim_move(
'z', 1, 3, mesh, color, sock);
4520 anim_move(
'x', 2, 1, mesh, color, sock);
4521 anim_move(
'z', 1, 2, mesh, color, sock);
4530 for (
int i=0; i<12; i++)
4532 if ((rubik.edge_[2 * i] == e0[0] &&
4533 rubik.edge_[2 * i + 1] == e0[1]) ||
4534 (rubik.edge_[2 * i] == e0[1] &&
4535 rubik.edge_[2 * i + 1] == e0[0]))
4543 cout <<
"Location of e0 = {"<<e0[0]<<
","<<e0[1]<<
"}: " << i0 << endl;
4549 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4554 anim_move(
'z', 1, i0, mesh, color, sock);
4555 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4556 anim_move(
'z', 1, 4-i0, mesh, color, sock);
4559 anim_move(
'x', 2, 3, mesh, color, sock);
4560 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4561 anim_move(
'x', 2, 1, mesh, color, sock);
4564 anim_move(
'y', 2, 3, mesh, color, sock);
4565 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4566 anim_move(
'y', 2, 1, mesh, color, sock);
4569 anim_move(
'x', 2, 2, mesh, color, sock);
4570 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4571 anim_move(
'x', 2, 2, mesh, color, sock);
4574 anim_move(
'y', 2, 1, mesh, color, sock);
4575 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4576 anim_move(
'y', 2, 3, mesh, color, sock);
4579 anim_move(
'y', 1, 1, mesh, color, sock);
4580 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4581 anim_move(
'y', 1, 3, mesh, color, sock);
4584 anim_move(
'y', 1, 3, mesh, color, sock);
4585 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4586 anim_move(
'y', 1, 1, mesh, color, sock);
4589 anim_move(
'x', 3, 1, mesh, color, sock);
4590 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4591 anim_move(
'x', 3, 3, mesh, color, sock);
4594 anim_move(
'x', 1, 1, mesh, color, sock);
4595 flip_edges(mesh, color, sock, 4, NULL, e1, e2, e3);
4596 anim_move(
'x', 1, 3, mesh, color, sock);
4600 else if (e1 != NULL)
4604 for (
int i=1; i<12; i++)
4606 if ((rubik.edge_[2 * i] == e1[0] &&
4607 rubik.edge_[2 * i + 1] == e1[1]) ||
4608 (rubik.edge_[2 * i] == e1[1] &&
4609 rubik.edge_[2 * i + 1] == e1[0]))
4617 cout <<
"Location of e1: " << i1 << endl;
4623 flip_edges(mesh, color, sock, 4, NULL, NULL, e2, e3);
4626 anim_move(
'y', 3, 1, mesh, color, sock);
4627 anim_move(
'x', 3, 1, mesh, color, sock);
4628 flip_edges(mesh, color, sock, 4, NULL, NULL, e2, e3);
4629 anim_move(
'x', 3, 3, mesh, color, sock);
4630 anim_move(
'y', 3, 3, mesh, color, sock);
4633 anim_move(
'y', 2, 1, mesh, color, sock);
4634 flip_edges(mesh, color, sock, 4, NULL, NULL, e2, e3);
4635 anim_move(
'y', 2, 3, mesh, color, sock);
4641 anim_move(
'z', 3, (i1-1)%4, mesh, color, sock);
4642 anim_move(
'x', 3, 2, mesh, color, sock);
4643 flip_edges(mesh, color, sock, 4, NULL, NULL, e2, e3);
4644 anim_move(
'x', 3, 2, mesh, color, sock);
4645 anim_move(
'z', 3, (9-i1)%4, mesh, color, sock);
4651 anim_move(
'z', 2, (i1-5)%4, mesh, color, sock);
4652 anim_move(
'x', 3, 3, mesh, color, sock);
4653 flip_edges(mesh, color, sock, 4, NULL, NULL, e2, e3);
4654 anim_move(
'x', 3, 1, mesh, color, sock);
4655 anim_move(
'z', 2, (13-i1)%4, mesh, color, sock);
4659 else if (e2 != NULL)
4663 for (
int i=2; i<12; i++)
4665 if ((rubik.edge_[2 * i] == e2[0] &&
4666 rubik.edge_[2 * i + 1] == e2[1]) ||
4667 (rubik.edge_[2 * i] == e2[1] &&
4668 rubik.edge_[2 * i + 1] == e2[0]))
4676 cout <<
"Location of e2: " << i2 << endl;
4682 flip_edges(mesh, color, sock, 4, NULL, NULL, NULL, e3);
4685 anim_move(
'x', 1, 3, mesh, color, sock);
4686 anim_move(
'y', 3, 1, mesh, color, sock);
4687 flip_edges(mesh, color, sock, 4, NULL, NULL, NULL, e3);
4688 anim_move(
'y', 3, 3, mesh, color, sock);
4689 anim_move(
'x', 1, 1, mesh, color, sock);
4695 anim_move(
'z', 3, (i2-2)%4, mesh, color, sock);
4696 anim_move(
'y', 3, 2, mesh, color, sock);
4697 flip_edges(mesh, color, sock, 4, NULL, NULL, NULL, e3);
4698 anim_move(
'y', 3, 2, mesh, color, sock);
4699 anim_move(
'z', 3, (10-i2)%4, mesh, color, sock);
4705 anim_move(
'z', 2, (i2-6)%4, mesh, color, sock);
4706 anim_move(
'y', 3, 3, mesh, color, sock);
4707 flip_edges(mesh, color, sock, 4, NULL, NULL, NULL, e3);
4708 anim_move(
'y', 3, 1, mesh, color, sock);
4709 anim_move(
'z', 2, (14-i2)%4, mesh, color, sock);
4713 else if (e3 != NULL)
4717 for (
int i=3; i<12; i++)
4719 if ((rubik.edge_[2 * i] == e3[0] &&
4720 rubik.edge_[2 * i + 1] == e3[1]) ||
4721 (rubik.edge_[2 * i] == e3[1] &&
4722 rubik.edge_[2 * i + 1] == e3[0]))
4730 cout <<
"Location of e3: " << i3 << endl;
4736 flip_edges(mesh, color, sock, 4, NULL, NULL, NULL, NULL);
4742 anim_move(
'z', 3, (i3-3)%4, mesh, color, sock);
4743 anim_move(
'x', 1, 2, mesh, color, sock);
4744 flip_edges(mesh, color, sock, 4, NULL, NULL, NULL, NULL);
4745 anim_move(
'x', 1, 2, mesh, color, sock);
4746 anim_move(
'z', 3, (7-i3)%4, mesh, color, sock);
4752 anim_move(
'z', 2, (i3-4)%4, mesh, color, sock);
4753 anim_move(
'x', 1, 3, mesh, color, sock);
4754 flip_edges(mesh, color, sock, 4, NULL, NULL, NULL, NULL);
4755 anim_move(
'x', 1, 1, mesh, color, sock);
4756 anim_move(
'z', 2, (12-i3)%4, mesh, color, sock);
4762 anim_move(
'x', 2, 3, mesh, color, sock);
4763 anim_move(
'z', 1, 2, mesh, color, sock);
4764 anim_move(
'x', 2, 1, mesh, color, sock);
4765 anim_move(
'z', 1, 2, mesh, color, sock);
4766 anim_move(
'x', 2, 3, mesh, color, sock);
4767 anim_move(
'z', 1, 3, mesh, color, sock);
4768 anim_move(
'x', 2, 1, mesh, color, sock);
4769 anim_move(
'z', 1, 2, mesh, color, sock);
4770 anim_move(
'x', 2, 3, mesh, color, sock);
4771 anim_move(
'z', 1, 2, mesh, color, sock);
4772 anim_move(
'x', 2, 1, mesh, color, sock);
4773 anim_move(
'z', 1, 1, mesh, color, sock);
4783 cout <<
"Entering solve_edge_orientations" << endl;
4792 for (
int i=0; i<12; i++)
4794 if (rubik.edge_[2 * i] != edge_colors_[2 * i])
4802 cout <<
"First incorrectly oriented edge location: " << i0 << endl;
4805 if (i0 < 0) {
return; }
4809 for (
int i=i0+1; i<12; i++)
4811 if (rubik.edge_[2 * i] != edge_colors_[2 * i])
4819 cout <<
"Second incorrectly oriented edge location: " << i1 << endl;
4825 for (
int i=i1+1; i<12; i++)
4827 if (rubik.edge_[2 * i] != edge_colors_[2 * i])
4837 cout <<
"Third incorrectly oriented edge location: " << i2 << endl;
4841 for (
int i=i2+1; i<12; i++)
4843 if (rubik.edge_[2 * i] != edge_colors_[2 * i])
4851 cout <<
"Fourth incorrectly oriented edge location: " << i3 << endl;
4855 int e0[2] = {rubik.edge_[2 * i0], rubik.edge_[2 * i0 + 1]};
4856 int e1[2] = {rubik.edge_[2 * i1], rubik.edge_[2 * i1 + 1]};
4857 int e2[2] = {rubik.edge_[2 * max(i2,0)], rubik.edge_[2 * max(i2,0) + 1]};
4858 int e3[2] = {rubik.edge_[2 * max(i3,0)], rubik.edge_[2 * max(i3,0) + 1]};
4866 flip_edges(mesh, color, sock, 4, e0, e1, e2, e3);
4878 cout <<
"Solving top center block..." << endl;
4883 cout <<
"Solving top tier edges..." << endl;
4888 cout <<
"Solving center blocks..." << endl;
4892 cout <<
"Solving top tier corners..." << endl;
4896 cout <<
"Move count: " << count_ << endl;
4905 cout <<
"Solving center blocks in the middle tier..." << endl;
4910 cout <<
"Solving edge blocks in the middle tier..." << endl;
4914 cout <<
"Move count: " << count_ << endl;
4922 cout <<
"Solving corner block locations in the bottom tier..." << endl;
4927 cout <<
"Solving corner block orientations..." << endl;
4932 cout <<
"Solving edge block locations..." << endl;
4937 cout <<
"Solving edge block orientations..." << endl;
4948 cout <<
"Solving top center block..." << endl;
4953 cout <<
"Solving top tier edges..." << endl;
4958 cout <<
"Solving top tier corners..." << endl;
4963 cout <<
"Solving center blocks in the middle tier..." << endl;
4968 cout <<
"Solving edge blocks in the middle tier..." << endl;
4973 cout <<
"Solving corner block locations in the bottom tier..." << endl;
4978 cout <<
"Solving corner block orientations..." << endl;
4983 cout <<
"Solving edge block locations..." << endl;
4988 cout <<
"Solving edge block orientations..." << endl;
4992 cout <<
"Move count: " << count_ << endl;
void AddHex(const int *vi, int attr=1)
void move_to_e7(int i7, int o7, Mesh &mesh, GridFunction &color, socketstream &sock)
void solve(Mesh &mesh, GridFunction &color, socketstream &sock)
int Size() const
Logical size of the array.
int locate_corner(int ind)
bool validate_centers(const int max_ind=6)
virtual void Print(std::ostream &out=mfem::out) const
void move_to_e8(int i8, int o8, Mesh &mesh, GridFunction &color, socketstream &sock)
const double * GetVertex(int i) const
Return pointer to vertex i's coordinates.
void print_state(ostream &out)
Class for grid function - Vector with associated FE space.
void move_to_e10(int i10, int o10, Mesh &mesh, GridFunction &color, socketstream &sock)
void update_centers(char axis, int incr)
int GetNBE() const
Returns number of boundary elements.
void solve_edge_orientations(Mesh &mesh, GridFunction &color, socketstream &sock)
bool validate_edges(const int max_ind=12)
void move_to_c7(int i7, int o7, Mesh &mesh, GridFunction &color, socketstream &sock)
void solve_mid(Mesh &mesh, GridFunction &color, socketstream &sock)
void move_to_c4(int i4, int o4, Mesh &mesh, GridFunction &color, socketstream &sock)
int GetNE() const
Returns number of elements.
void move_to_e5(int i5, int o5, Mesh &mesh, GridFunction &color, socketstream &sock)
int main(int argc, char *argv[])
void permute_edges(Mesh &mesh, GridFunction &color, socketstream &sock, int *e0, int *e1, int *e2)
void AddVertex(const double *)
void solve_edge_locations(Mesh &mesh, GridFunction &color, socketstream &sock)
void update_edges(char axis, int tier, int incr)
void move_to_e4(int i4, int o4, Mesh &mesh, GridFunction &color, socketstream &sock)
void solve_centers(Mesh &mesh, GridFunction &color, socketstream &sock)
void GetBdrElementAdjacentElement(int bdr_el, int &el, int &info) const
For the given boundary element, bdr_el, return its adjacent element and its info, i...
void anim_move(char axis, int tier, int increment, Mesh &mesh, GridFunction &color, socketstream &sock)
void solve_top(Mesh &mesh, GridFunction &color, socketstream &sock)
void solve_corner_orientations(Mesh &mesh, GridFunction &color, socketstream &sock)
void init_hex_mesh(Mesh &mesh)
void PrintUsage(std::ostream &out) const
void solve_bot_corner_locations(Mesh &mesh, GridFunction &color, socketstream &sock)
void solve_corner_locations(Mesh &mesh, GridFunction &color, socketstream &sock)
void update_corners(char axis, int tier, int incr)
void move_to_c6(int i6, int o6, Mesh &mesh, GridFunction &color, socketstream &sock)
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
void flip_edges(Mesh &mesh, GridFunction &color, socketstream &sock, int n, int *e0=NULL, int *e1=NULL, int *e2=NULL, int *e3=NULL)
void FinalizeTopology(bool generate_bdr=true)
Finalize the construction of the secondary topology (connectivity) data of a Mesh.
void AddOption(bool *var, const char *enable_short_name, const char *enable_long_name, const char *disable_short_name, const char *disable_long_name, const char *description, bool required=false)
void move_to_e6(int i6, int o6, Mesh &mesh, GridFunction &color, socketstream &sock)
void swap_corners(Mesh &mesh, GridFunction &color, socketstream &sock, int *c0=NULL, int *c1=NULL)
void rotate_step(char axis, int incr, double *x)
void solve_top_edges(Mesh &mesh, GridFunction &color, socketstream &sock)
class for piecewise constant coefficient
void mark_elements(Mesh &mesh, char axis, int tier)
void solve_bot(Mesh &mesh, GridFunction &color, socketstream &sock)
void solve_top_corners(Mesh &mesh, GridFunction &color, socketstream &sock)
void determine_random_moves(Array< Move > &moves)
void PrintOptions(std::ostream &out) const
virtual void ProjectCoefficient(Coefficient &coeff)
void twist_corners(Mesh &mesh, GridFunction &color, socketstream &sock, bool cw, int *c0=NULL, int *c1=NULL, int *c2=NULL)
void SetAttribute(int i, int attr)
Set the attribute of element i.
void move_to_c5(int i5, int o5, Mesh &mesh, GridFunction &color, socketstream &sock)
bool anim_step(char axis, int incr, Mesh &mesh)
void repaint_cube(Mesh &mesh, GridFunction &color, socketstream &sock)
bool validate_corners(const int max_ind=8)
OutStream out(std::cout)
Global stream used by the library for standard output. Initially it uses the same std::streambuf as s...
void move_to_e9(int i9, int o9, Mesh &mesh, GridFunction &color, socketstream &sock)
void solve_top_center(Mesh &mesh, GridFunction &color, socketstream &sock)
int GetAttribute(int i) const
Return the attribute of element i.
void solve_mid_edges(Mesh &mesh, GridFunction &color, socketstream &sock)
void move_to_e11(int i11, int o11, Mesh &mesh, GridFunction &color, socketstream &sock)
void GetBdrElementVertices(int i, Array< int > &v) const
Returns the indices of the vertices of boundary element i.
void GetElementVertices(int i, Array< int > &v) const
Returns the indices of the vertices of element i.
void update_state(char axis, int tier, int incr)
Arbitrary order "L2-conforming" discontinuous finite elements.