#include int pos[256]; int psize; int sol[256]; int ssize; char *bin(int v) { static char r[16]; char *s = r; int i; for (i = 7; i >= 0; i--, s++) *s = !!(v & (1 << i)) + '0'; *s = 0; return r; } int pos_is_there(int v) { int i; for (i = 0; i < psize; i++) if (pos[i] == v) return 1; return 0; } int sol_is_there(int v) { int i; for (i = 0; i < ssize; i++) if (sol[i] == v) return 1; return 0; } int has_n_bits(int p, int n) { int i; /* n bits needed */ for (i = 0; i < 8; i++) if (p & (1 << i)) n--; return n == 0; } void add_pos(int p) { int i; int v; if (!has_n_bits(p, 3)) return; /* no p or rotation of p already there */ v = p; for (i = 0; i < 8; i++) { if (pos_is_there(v)) return; v = ((v << 1) | (v >> 7)) & 255; } pos[psize] = p; psize++; } int sol_valid(int s, int p) { int i; int v; /* at least one rotation of s has to be compatibles with p * (ie. no common bit) (ie. v & ~p == v) */ v = s; for (i = 0; i < 8; i++) { if ((v & ~p) == v) return 1; v = ((v << 1) | (v >> 7)) & 255; } return 0; } void add_sol(int s) { int i; int v; if (!has_n_bits(s, 3)) return; /* no s or rotation of s already there */ v = s; for (i = 0; i < 8; i++) { if (sol_is_there(v)) return; v = ((v << 1) | (v >> 7)) & 255; } /* s or rotation of s can be put for all the pos */ for (i = 0; i < psize; i++) { if (!sol_valid(s, pos[i])) return; } sol[ssize] = s; ssize++; } int main(void) { int i; for (i = 0; i < 256; i++) add_pos(i); printf("%d pos\n", psize); for (i = 0; i < psize; i++) printf("%d %s\n", i, bin(pos[i])); for (i = 0; i < 256; i++) add_sol(i); printf("%d sol\n", ssize); for (i = 0; i < ssize; i++) printf("%d %s\n", i, bin(sol[i])); }