Photolog
Back to list of problems
Rare Order
200.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN(a,b) ((a) < (b) ? (a) : (b))
int num_vars=0;
char * vars = NULL;
int num_cons=0;
struct cons {
char a;
char b;
} * cons = NULL;
/* 1 if everything is ok
* 0 if something is wrong
*/
int
test(int num, char *order) {
int i;
char *s, *t;
#if DEBUG
printf("HCK: test('%*.*s')\n", num, num, order);
#endif
for (i=0; i<num_cons; i++) {
s = memchr(order, cons[i].a, num);
t = memchr(order, cons[i].b, num);
if (!t) continue;
if (!s) return 0;
if (s > t) return 0;
}
return 1;
}
void
print(int num, char *order) {
int i;
for (i=0; i<num; i++) {
printf("%c", order[i]);
}
printf("\n");
}
void
doit2(int num, char *order) {
int i;
if (num==num_vars) {
print(num, order);
return;
}
for (i=0; i<num_vars; i++) {
if (memchr(order, vars[i], num)) continue;
order[num] = vars[i];
if (test(num+1,order)) {
#if DEBUG
printf("HCK: num=%d, trying '%c'\n", num, vars[i]);
#endif
doit2(num+1, order);
}
}
}
void
doit(void) {
char order[30];
doit2(0, &order[0]);
}
int
compar(const void *a, const void *b) {
return *(char *)a - *(char *)b;
}
void
new_var(char a) {
int i;
for (i=0; i<num_vars; i++) {
if (vars[i] == a) {
return;
}
}
vars = realloc(vars, (num_vars+1)*sizeof(char));
vars[num_vars++] = a;
}
int
main(void) {
char *buf1, *buf2;
int i;
buf1 = malloc(1024);
buf2 = malloc(1024);
fgets(buf1, 1024, stdin);
if (buf1[0]=='#') {
return 0;
}
while(buf1[strlen(buf1)-1]<'A' ||buf1[strlen(buf1)-1]>'Z') {
buf1[strlen(buf1)-1] = '\0';
}
while(fgets(buf2, 1024, stdin)) {
char *s;
if (buf2[0]=='#') {
break;
}
while(buf1[strlen(buf1)-1]<'A' ||buf1[strlen(buf1)-1]>'Z') {
buf1[strlen(buf1)-1] = '\0';
}
for (i=0; i<MIN(strlen(buf1),strlen(buf2)); i++) {
if (buf1[i] != buf2[i]) {
new_var(buf1[i]);
new_var(buf2[i]);
cons = realloc(cons, (num_cons+1)*sizeof(struct cons));
cons[num_cons].a = buf1[i];
cons[num_cons].b = buf2[i];
num_cons++;
break;
}
}
s = buf1;
buf1 = buf2;
buf2 = s;
}
qsort(vars, num_vars, sizeof(char), compar);
#if DEBUG
printf("%d vars:", num_vars);
for (i=0; i<num_vars; i++) {
printf(" %c", vars[i]);
}
printf("\n%d constraints:", num_cons);
for (i=0; i<num_cons; i++) {
printf(" %c<%c", cons[i].a, cons[i].b);
}
printf("\n");
#endif
doit();
return 0;
}









