#include #include #include #define X_P 0 #define X_N 1 #define Y_P 2 #define Y_N 3 #define Z_P 4 #define Z_N 5 typedef struct pos POS; typedef struct rot ROT; struct rot { int nr; char r[8]; } ; struct pos { unsigned char faces[6]; ROT mr; } ; static POS pv[24]; static int npv; static POS initpos(void) { return((POS){.faces={0,1,2,3,4,5}}); } static POS apply_rot(char rot, POS p) { static const int svx[4] = { Z_P, Y_N, Z_N, Y_P }; static const int svy[4] = { X_P, Z_N, X_N, Z_P }; static const int svz[4] = { Y_P, X_N, Y_N, X_P }; const int *sv; char t; switch (rot) { default: abort(); break; case 'x': sv = &svx[0]; break; case 'y': sv = &svy[0]; break; case 'z': sv = &svz[0]; break; } t = p.faces[sv[0]]; p.faces[sv[0]] = p.faces[sv[1]]; p.faces[sv[1]] = p.faces[sv[2]]; p.faces[sv[2]] = p.faces[sv[3]]; p.faces[sv[3]] = t; return(p); } static void gen_poses(void) { int any; int i; int try(char rot, POS p) { int i; p = apply_rot(rot,p); p.mr.r[p.mr.nr++] = rot; for (i=npv-1;i>=0;i--) { if (!bcmp(&p.faces[0],&pv[i].faces[0],6)) { if (pv[i].mr.nr <= p.mr.nr) return(0); pv[i].mr = p.mr; return(1); } } if (npv >= 24) abort(); pv[npv++] = p; return(1); } pv[0] = initpos(); pv[0].mr.nr = 0; npv = 1; do { any = 0; for (i=npv-1;i>=0;i--) { any |= try('x',pv[i]); any |= try('y',pv[i]); any |= try('z',pv[i]); } } while (any); } static void dump_output(void) { int i; int j; int k; int v[6]; if (npv != 24) abort(); for (i=0;i<24;i++) { for (j=6-1;j>=0;j--) v[j] = -1; for (j=6-1;j>=0;j--) v[pv[i].faces[j]] = j; printf("%d%d%d%d%d%d %d%d%d%d%d%d %.*s\n", pv[i].faces[0], pv[i].faces[1], pv[i].faces[2], pv[i].faces[3], pv[i].faces[4], pv[i].faces[5], v[0], v[1], v[2], v[3], v[4], v[5], pv[i].mr.nr, &pv[i].mr.r[0] ); } for (i=0;i<24;i++) { for (j=0;j<24;j++) { for (k=6-1;k>=0;k--) v[k] = -1; for (k=6-1;k>=0;k--) v[k] = pv[i].faces[pv[j].faces[k]]; printf(" %d%d%d%d%d%d",v[0],v[1],v[2],v[3],v[4],v[5]); } printf("\n"); } } int main(void); int main(void) { gen_poses(); dump_output(); return(0); }