#include #include struct kamen { struct kamen *next_horiz; struct kamen *next_vert; int i; int j; int cislo; int barva; int tisknuto; }; struct kamen * hash_horiz[100], * hash_vert[100]; int cislo; /* Počet kamenů */ void tiskni(struct kamen *kam) { printf("Kamen cislo %d (na %d, %d) by mel byt %s.\n", kam->cislo, kam->i, kam->j, kam->barva==1?"cerveny":"zeleny"); } /* Obarvíme daný vrchol a jdeme rekurzivně barvit souseda (podle proměnné 'faze' buď vertikálního) nebo horizontálního */ void oznac(struct kamen *kam, int faze, int barva) { if (!kam) return; if (!faze) { int j; kam->barva = barva+1; tiskni(kam); j = kam->j; kam = hash_vert[j%100]; while (kam) { if ((j==kam->j) && !kam->barva) return oznac(kam, !faze, !barva); kam = kam->next_vert; } return; } if (faze) { int i; kam->barva = barva+1; tiskni(kam); i = kam->i; kam = hash_horiz[i%100]; while (kam) { if ((i==kam->i) && !kam->barva) return oznac(kam, !faze, !barva); kam = kam->next_horiz; } return; } } int main(void) { int i; struct kamen *kam = malloc(sizeof(struct kamen)); /* Načteme vstup */ while (scanf("%d %d\n", &kam->i, &kam->j)==2) { kam->cislo = ++cislo; kam->tisknuto = kam->barva = 0; kam->next_horiz = hash_horiz[kam->i % 100]; hash_horiz[kam->i % 100] = kam; kam->next_vert = hash_vert[kam->j % 100]; hash_vert[kam->j % 100] = kam; kam = malloc(sizeof(struct kamen)); } /* Jdeme barvit */ for (i=0; i<100; i++) { /* Projdeme celou hashovací tabulku */ struct kamen *kamen = hash_horiz[i]; while (kamen) { if (!kamen->barva) { /* Kámen ještě nemá barvu? */ /* Obarvíme komponentu grafu na jednu a na druhou stranu */ oznac(kamen, 0, 0); oznac(kamen, 1, 0); } kamen = kamen->next_horiz; } } return 0; }