#include #include #include int sol[200][6][6][2]; int size; #define SIZE (6*6*2*sizeof(int)) void normalize(int a[6][6][2], int b[6][6][2]) { int p[18]; int x, y, z; int piece = 1; memset(p, 0, sizeof(p)); for (x = 0; x < 6; x++) for (y = 0; y < 6; y++) for (z = 0; z < 2; z++) { int cur = a[x][y][z]; if (!p[cur-1]) { p[cur-1] = piece; piece++; } b[x][y][z] = p[cur-1]; } } void read_sol(int s[6][6][2]) { int t[6][6][2]; int x, y, z; for (z = 0; z < 2; z++) { for (y = 0; y < 6; y++) { for (x = 0; x < 6; x++) { if (scanf(" %d", &t[x][y][z]) != 1) abort(); } } } normalize(t, s); } void rotate1(int a[6][6][2], int b[6][6][2]) { int x, y, z; /* rotate pi/2 * (a+ib)(cos+isin) = (a+ib)(i) = -b + ia * nx = -y; ny = x; */ for (x = 0; x < 6; x++) for (y = 0; y < 6; y++) for (z = 0; z < 2; z++) { int nx = 5-y; int ny = x; b[nx][ny][z] = a[x][y][z]; } } void rotate2(int a[6][6][2], int b[6][6][2]) { int x, y, z; /* pi for (y,z): ny = -y; nz = -z; */ for (x = 0; x < 6; x++) for (y = 0; y < 6; y++) for (z = 0; z < 2; z++) { int ny = 5-y; int nz = 1-z; b[x][ny][nz] = a[x][y][z]; } } void mirror(int a[6][6][2], int b[6][6][2]) { int x, y, z; /* nz = -z */ for (x = 0; x < 6; x++) for (y = 0; y < 6; y++) for (z = 0; z < 2; z++) { int nz = 1-z; b[x][y][nz] = a[x][y][z]; } } /* check if s is a rotation/symmetry of p, return number of equalities */ int check_solution(int s[6][6][2], int p[6][6][2]) { int s2[6][6][2]; int s3[6][6][2]; int sn[6][6][2]; int sx[6][6][2]; int n = 0; int i; memcpy(s2, s, SIZE); for (i = 0; i < 3; i++) { rotate1(s2, s3); normalize(s3, sn); if (memcmp(sn, p, SIZE) == 0) n++; memcpy(s2, s3, SIZE); } rotate2(s, s3); normalize(s3, s2); for (i = 0; i < 4; i++) { rotate1(s2, s3); normalize(s3, sn); if (memcmp(sn, p, SIZE) == 0) n++; memcpy(s2, s3, SIZE); } mirror(s, s3); normalize(s3, sx); memcpy(s2, sx, SIZE); for (i = 0; i < 4; i++) { rotate1(s2, s3); normalize(s3, sn); if (memcmp(sn, p, SIZE) == 0) n++; memcpy(s2, s3, SIZE); } rotate2(sx, s3); normalize(s3, s2); for (i = 0; i < 4; i++) { rotate1(s2, s3); normalize(s3, sn); if (memcmp(sn, p, SIZE) == 0) n++; memcpy(s2, s3, SIZE); } return n; } int check(int s[6][6][2]) { int i; for (i = 0; i < size; i++) { int n = check_solution(s, sol[i]); if (n) { printf("is like out %d\n", i); return n; } } return 0; } void p(int busy[6][6][2]) { int x, y, z; printf("------------------"); for (z = 0; z < 2; z++) { for (y = 0; y < 6; y++) { for (x = 0; x < 6; x++) { printf(" %2.2d", busy[x][y][z]); } printf(""); } printf(""); } printf("\n"); } int main(void) { int s[6][6][2]; int i; int n; for (i = 0; i < 136; i++) { read_sol(s); n = check_solution(s, s); printf("in sol %d n itself %d\n", i, n); n = check(s); printf("%d %d\n", i, n); if (!n) { printf("adding in %d to out %d\n", i, size); memcpy(sol[size], s, SIZE); size++; } } printf("size %d\n", size); for (i = 0; i < size; i++) { int n = check_solution(sol[i], sol[i]); printf("%d %d\n", i, n); } for (i = 0; i < size; i++) p(sol[i]); }