Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <stdio.h> long ludzi,rozkazow, rozkazy[1001][3], got, pocz; long Odp[41]; char tab[40]; int SPROBUJ(long nr_rozk) { if (nr_rozk==0) { Odp[got]++; return 0; } // Sprawdzam, czy ten rozkaz "co� zrobi". if ( ( tab[rozkazy[nr_rozk][1]] == 1 ) && ( tab[rozkazy[nr_rozk][2]] == 0 ) ) { // Tzn. �e ten rozkaz blokuje - nic si� nie da zrobi�. return 0; } // W ka�dym innym przypadku ten rozstaw przechodzi dalej. SPROBUJ(nr_rozk-1); // Ale je�li jest dok�adnie na odwr�t, to powstaje rozwidlenie: if ( ( tab[rozkazy[nr_rozk][1]] == 0 ) && ( tab[rozkazy[nr_rozk][2]] == 1 ) ) { tab[rozkazy[nr_rozk][1]] = 1; tab[rozkazy[nr_rozk][2]] = 0; SPROBUJ(nr_rozk-1); tab[rozkazy[nr_rozk][1]] = 0; tab[rozkazy[nr_rozk][2]] = 1; } return 0; } int main() { scanf("%ld",&ludzi); scanf("%ld",&rozkazow); for (int ii=1; ii<=rozkazow; ii++) { scanf("%ld %ld",&rozkazy[ii][1],&rozkazy[ii][2]); } for (int ii=1; ii<=40; ii++) Odp[ii]=0; Odp[1]=ludzi; Odp[ludzi]=1; // A dla liczby Gotowych od 2 do ludzi-1 trzeba to dopiero policzy�... for (got=2; got<ludzi; got++) { // Spr�buj� rekurencyjnie... // Najpierw musz� ka�d� z opcji "ko�cowego stanu" ustawi� for (pocz=1; pocz <= ludzi-got+1; pocz++) { for (int ii=1; ii<=ludzi; ii++) tab[ii]=0; for (int ii=pocz; ii<=pocz+got-1; ii++) tab[ii]=1; // Tu mam gotowy rozstaw pocz�tkowy, teraz musz� sprawdzi� kolejne rozkazy SPROBUJ(rozkazow); } } //for (int ii=1; ii<=ludzi; ii++) printf("%ld ",Odp[ii]); //printf("\n"); for (int ii=1; ii<=ludzi; ii++) { if (Odp[ii]%2==0) printf("0 "); else printf("1 "); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <stdio.h> long ludzi,rozkazow, rozkazy[1001][3], got, pocz; long Odp[41]; char tab[40]; int SPROBUJ(long nr_rozk) { if (nr_rozk==0) { Odp[got]++; return 0; } // Sprawdzam, czy ten rozkaz "co� zrobi". if ( ( tab[rozkazy[nr_rozk][1]] == 1 ) && ( tab[rozkazy[nr_rozk][2]] == 0 ) ) { // Tzn. �e ten rozkaz blokuje - nic si� nie da zrobi�. return 0; } // W ka�dym innym przypadku ten rozstaw przechodzi dalej. SPROBUJ(nr_rozk-1); // Ale je�li jest dok�adnie na odwr�t, to powstaje rozwidlenie: if ( ( tab[rozkazy[nr_rozk][1]] == 0 ) && ( tab[rozkazy[nr_rozk][2]] == 1 ) ) { tab[rozkazy[nr_rozk][1]] = 1; tab[rozkazy[nr_rozk][2]] = 0; SPROBUJ(nr_rozk-1); tab[rozkazy[nr_rozk][1]] = 0; tab[rozkazy[nr_rozk][2]] = 1; } return 0; } int main() { scanf("%ld",&ludzi); scanf("%ld",&rozkazow); for (int ii=1; ii<=rozkazow; ii++) { scanf("%ld %ld",&rozkazy[ii][1],&rozkazy[ii][2]); } for (int ii=1; ii<=40; ii++) Odp[ii]=0; Odp[1]=ludzi; Odp[ludzi]=1; // A dla liczby Gotowych od 2 do ludzi-1 trzeba to dopiero policzy�... for (got=2; got<ludzi; got++) { // Spr�buj� rekurencyjnie... // Najpierw musz� ka�d� z opcji "ko�cowego stanu" ustawi� for (pocz=1; pocz <= ludzi-got+1; pocz++) { for (int ii=1; ii<=ludzi; ii++) tab[ii]=0; for (int ii=pocz; ii<=pocz+got-1; ii++) tab[ii]=1; // Tu mam gotowy rozstaw pocz�tkowy, teraz musz� sprawdzi� kolejne rozkazy SPROBUJ(rozkazow); } } //for (int ii=1; ii<=ludzi; ii++) printf("%ld ",Odp[ii]); //printf("\n"); for (int ii=1; ii<=ludzi; ii++) { if (Odp[ii]%2==0) printf("0 "); else printf("1 "); } return 0; } |