/* Routine to solve Verners 4 cube problem Niels Lund, november 2016 */ #include #include #include #include int main(int argc, char* argv[]) { int i, j, k, index, axnum=0, asum, i1, i2, i3, i0, asum0, asum1, asum2; int axn, sol, sidesum0, sidesum1, sidesum2, sidesum3, axphase0, axphase1, axphase2, axphase3; int sides00, sides01, sides02, sides03, sides10, sides11, sides12, sides13, sides20, sides21, sides22, sides23; /* blue: 1, green: 2, red: 4, white: 8 */ int cube[4][6] = {1,2,4,4,8,8, 1,2,2,8,8,4, 1,2,8,4,2,1, 1,2,4,8,4,4}; int order[3][2][4] = {1,2,4,5, 1,5,4,2, 3,2,0,5, 3,5,0,2, 1,3,4,0, 1,0,4,3}; int sums[4][3], axes[91][4]; char sidecolor[4][4][8], color[9][8]; for (i=0; i<9; i++) sprintf(color[i], "%s", " "); sprintf(color[1], "%s", " blue"); sprintf(color[2], "%s", "green"); sprintf(color[4], "%s", " red"); sprintf(color[8], "%s", "white"); for (i=0; i<3; i++) for (j=0; j<4; j++) sums[j][i] = 0; printf("\nFind sidesums for each cube for each of three possible axes:\n"); printf("Colorvalues used; blue: 1, green: 2, red: 4, white: 8\n"); k = 0; for (j=0; j<4; j++) { /* For each of the four cubes */ for (i=0; i<3; i++) { /* Try three axis directions */ index = order[i][0][0]; sums[j][i] += cube[j][index]; /* Add contributions from four sides */ index = order[i][0][1]; sums[j][i] += cube[j][index]; index = order[i][0][2]; sums[j][i] += cube[j][index]; index = order[i][0][3]; sums[j][i] += cube[j][index]; printf("%2d, cube: %1d, axis: %1d, sidesum: %2d\n", k, j, i, sums[j][i]); k++; } } /* we now have know the sums of side face values for each of the 4 cubes and each of three axis orientations */ printf("\nFind axis combinations for the four cubes where sum of all sidesums is 60:\n"); axnum = 0; k = 0; for (i0=0; i0<3; i0++) { asum = sums[0][i0]; asum0 = asum; for (i1=0; i1<3; i1++) { asum += sums[1][i1]; asum1 = asum; for (i2=0; i2<3; i2++) { asum += sums[2][i2]; asum2 = asum; for (i3=0; i3<3; i3++) { asum += sums[3][i3]; if (asum == 60) { axes[axnum][0] = i0; axes[axnum][1] = i1; axes[axnum][2] = i2; axes[axnum][3] = i3; axnum++; printf("%2d, num: %2d, asum: %2d, axes: %1d %1d %1d %1d\n", k, axnum, asum, i0, i1, i2, i3); } k++; asum = asum2; } asum = asum1; } asum = asum0; } } /* we now know which combinations of axis directions for the four cubes which possibly may provide the solution int cube[4][6] = {1,2,4,4,8,8, 1,2,2,8,8,4, 1,2,8,4,2,1, 1,2,4,8,4,4}; int order[3][2][4] = {1,2,4,5, 1,5,4,2, 3,2,0,5, 3,5,0,2, 1,3,4,0, 1,0,4,3}; */ printf("\nSearch solutions by going through all cube orientations for the %1d valid axis combinations\n", axnum); k = 0; sol = 0; for (axn=0; axn