#include #include #define SOUBOR_VSTUP "spagety.in" #define MAX_N 100000 /* Tvar vstupu: - První řádek obsahuje čísla X,Y,Z - rozměry talíře - Následuje Z vrstev (Z je směr osy gravitace), každá vrstva je uvozena prázdnou řádkou (pro přehlednost) - Každá vrstva je složena z Y řádků a na každém řádku je mezerou odděleno X čísel - Číslo 0 znamená volno, jinak je zde špageta s daným indexem - Předpokládáme, že špagety jsou číslované (bez mezer) 1..N Ukázková vstupní data (odpověď jsou 4 kroky): 5 5 5 0 1 1 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 2 0 0 0 0 2 1 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 3 3 0 0 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 0 3 0 4 4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */ // Zásobníková struktura typedef struct tzasobnik tzasobnik; struct tzasobnik { int cislo; tzasobnik *dalsi; }; tzasobnik *push(tzasobnik *zasobnik, int cislo) { tzasobnik *nova = (tzasobnik *) malloc(sizeof(tzasobnik)); nova->cislo = cislo; nova->dalsi = zasobnik; return nova; } tzasobnik *pop(tzasobnik *zasobnik) { tzasobnik *pomocna = zasobnik->dalsi; free(zasobnik); return pomocna; } int main() { FILE *vstup=fopen(SOUBOR_VSTUP, "r"); //FILE *vstup=stdin; int X,Y,Z; fscanf(vstup, "%d %d %d", &X,&Y,&Z); int x,y,z; // Vytvoříme si 2D tabulku znázorňující aktuální pokryv int** pokryv; pokryv = (int**) malloc(X*sizeof(int*)); for(x=0; xN) N = ID; } } } fclose(vstup); // Máme načteno, začneme zpracovávat int snezeno = 0; int kroku = 0; tzasobnik *zasobnik = NULL; for(i=1; i<=N; i++) if(pokryto[i]==0) zasobnik = push(zasobnik, i); do { tzasobnik *pomocny = NULL; kroku++; while(zasobnik!=NULL) { int ID = zasobnik->cislo; snezeno++; while(pokryva[ID]!=NULL) { int ID2 = pokryva[ID]->cislo; pokryto[ID2]--; if(pokryto[ID2]==0) { pomocny = push(pomocny, ID2); // Odebrali jsme poslední kousek, který zakrýval špagetu ID2 } pokryva[ID] = pop(pokryva[ID]); } zasobnik = pop(zasobnik); } zasobnik = pomocny; } while(zasobnik!=NULL); if(snezeno == N) printf("Vsechny spagety snezeny za %d kroku.\n", kroku); else printf("Spagety nelze snist!\n"); return 0; }