#include #include int boji_se(int a, int b) { ... } typedef struct { int a, b; } dotaz; /* * Ověří, zda C je kandidát na ďábla položením všech dotazů, * které na něj ještě nebyly položeny. Předchozích N-1 dotazů * je uloženo v poli DOTAZY. */ static int over_kandidata(int c, int n, dotaz dotazy[]) { int *c_jako_a = calloc(n, sizeof(int)); int *c_jako_b = calloc(n, sizeof(int)); int i, ret = 1; for (i = 0; i < n - 1; i++) { if (dotazy[i].a == c) c_jako_a[dotazy[i].b - 1] = 1; if (dotazy[i].b == c) c_jako_b[dotazy[i].a - 1] = 1; } for (i = 1; i <= n; i++) { if (i == c) continue; if (!c_jako_a[i - 1] && boji_se(c, i)) { ret = 0; goto end; } if (!c_jako_b[i - 1] && !boji_se(i, c)) { ret = 0; goto end; } } end: free(c_jako_a); free(c_jako_b); return ret; } /* * Porovnává čerty, dokud neurčí jediného možného kandidáta * na ďábla. Provedené dotazy ukládá do pole DOTAZY. */ static int najdi_kandidata(int n, dotaz dotazy[]) { int *s = calloc(2*n - 1, sizeof(int)); int i, a, b, z, k; for (i = 0; i < n; i++) s[i] = i + 1; z = 0; k = n; for (i = 0; i < n - 1; i++) { a = s[z]; b = s[z + 1]; z += 2; dotazy[i].a = a; dotazy[i].b = b; if (boji_se(a, b)) s[k] = b; else s[k] = a; k++; } free(s); return s[z]; } int dabel(int n) { dotaz *dotazy = calloc(n - 1, sizeof(dotaz)); int c = najdi_kandidata(n, dotazy); int ret = over_kandidata(c, n, dotazy) ? c : 0; free(dotazy); return ret; }