#include #define MAXN 16 int a[MAXN][MAXN], pm[MAXN], us[MAXN]; int n, n1, sw; long int icnt, count, t1, t2; main(argc, argv) int argc; char *argv[]; { char buf[256]; int i, j; t1 = time(NULL); if (argc > 1) usage(); icnt = 0; count = 0; while (fgets(buf, 256, stdin) != NULL) { icnt ++; i = 0; while (buf[i] != ':') i ++; while (buf[i] != '0' && buf[i] != '1') i ++; n = 2; while (buf[i] == '0' || buf[i] == '1') { n ++; for (j = 2; j < n; j ++, i ++) { a[j][n] = (buf[i] == '1') ? 1 : 0; a[n][j] = - a[j][n]; } while (buf[i] == ' ') i ++; } n += 2; if (count == 0) fprintf(stderr, "n = %d\n", n); n1 = n - 1; subr1(1); } t2 = time(NULL); fprintf(stderr, "in count: %ld\n", icnt); fprintf(stderr, "out count: %ld\n", count); fprintf(stderr, "time: %ld sec\n", t2 - t1); } usage() { fputs("usage: soku3 outfile\n", stderr); fputs("input(n=4) is\n", stderr); fputs(" 1: 0\n", stderr); fputs(" 2: 1\n", stderr); fputs("^z\n", stderr); exit(0); } subr1(i) int i; { int k; if (i == n-2) { check(); } else { i++; a[i][n1] = 0; a[n1][i] = 0; subr1(i); if (i>=3) { for (k=2; k<=i-1; k++) if (a[k][i]==1 && a[k][n1]==0) return; } /* all 1 tate if (i == n-2) { for (k = 2; k < i; k++) if (a[k][n1] == 0) break; if (k >= i) return; } */ a[i][n1] = 1; a[n1][i] = -1; subr1(i); } } check() { int k, l, m; if (n1>=4) { for (k=3; k<=n-2; k++) if (a[k][n1] != 1) { m = 0; for (l=k-1; l>=2; l--) { if (a[l][k]==0 || a[l][n1]==0) continue; if (m>0 && a[l][m]==0) return; if (m==0) m = l; } } } for (k = 2; k < n; k++) us[k] = 0; sw = 1; unique(2); if (sw) display(); } unique(i) int i; { int k, m; if (i >= n) pmchk(); else for (k = 2; k < n; k++) { if (us[k]) goto aa; for (m = 2; m < n; m++) if (us[m] == 0 && a[k][m] < 0) goto aa; pm[i] = k; us[k] = 1; unique(i+1); if (sw == 0) return; us[k] = 0; aa: ; } } pmchk() { int k, l, kk, ll; for (k = 3; k <= n-1; k++) { kk = pm[k]; for (l = 2; l <= k-1; l++) { ll = pm[l]; if (a[ll][kk] > a[l][k]) return; if (a[ll][kk] < a[l][k]) { sw = 0; return; } } } } display() { int k, l; count++; printf("%8ld: " ,count); for (k=3; k<=n-1; k++) { printf(" "); for (l=2; l<=k-1; l++) printf("%1d", a[l][k]); } printf("\n"); }