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>
//#include <conio.h>
long n,m,klawisze[400001][3],liczba;
char stan[200001],stop;
char bylo[1050001]; // Maksymalnie dla n==20
long teraz[200001],pozniej[200001], SUM;
long liczba_ze_stanu()
{
long LL=stan[1];
for (int qwe=2; qwe<=n; qwe++) LL=LL*2+stan[qwe];
return LL;
}
int stan_z_liczby(long liczba)
{
for (int qwe=n; qwe>=1; qwe--)
{
stan[qwe] = liczba % 2;
liczba = liczba/2;
}
return 0;
}
int main()
{
scanf("%ld",&n);
scanf("%ld",&m);
for (int ii=1; ii<=n; ii++) scanf("%d",&stan[ii]);
for (int ii=1; ii<=m; ii++) scanf("%ld %ld",&klawisze[ii][1], &klawisze[ii][2]);
if (m==0) {printf("1"); return 0;}
for (int ii=0; ii<=1050000; ii++) bylo[ii]=0;
// Zamieniam stan na liczb�:
pozniej[0]=1; pozniej[pozniej[0]]=liczba_ze_stanu();
bylo[ pozniej[pozniej[0]] ] = 1;
stop=0;
while (!stop)
{
for (int ii=0; ii<=pozniej[0]; ii++) teraz[ii] = pozniej[ii];
pozniej[0]=0;
if (teraz[0]==0) stop=1;
// Po kolei sprawdzam zapisane stany:
for (int ter=1; ter<=teraz[0]; ter++)
{
// Na podstawie liczby tworz� dany stan:
stan_z_liczby(teraz[ter]);
// printf("Biezaca liczba: %ld\n",teraz[ter]);
// printf("Stan: "); for (int ii=1; ii<=n; ii++) printf("%d ",stan[ii]);
// printf("\n\n");
// Teraz po kolei pr�buj� ka�dego z przycisk�w i sprawdzam, czy kt�ry� mo�e zadzia�a�.
for (int klaw=1; klaw<=m; klaw++)
{
if ( stan[ klawisze[klaw][1] ] == stan [ klawisze[klaw][2] ] )
{
// printf("Zadzialal klawisz (%ld,%ld)\n",klawisze[klaw][1],klawisze[klaw][2]);
// getch();
// Ten zadzia�a, wi�c chwilowo w��czam ten klawisz
stan[ klawisze[klaw][1] ] = (stan[ klawisze[klaw][1] ]+1) % 2;
stan[ klawisze[klaw][2] ] = stan[ klawisze[klaw][1] ];
// Sprawdzam, czy ten stan ju� wcze�niej by� rozpatrywany:
liczba = liczba_ze_stanu();
if (bylo[liczba]==0)
{ // Tego stanu jeszcze nie by�o - zapisuj� do zrobienia p�niej
pozniej[0]++;
pozniej[pozniej[0]] = liczba;
bylo[liczba]=1;
// if (pozniej[0] >=200000) printf("PRZEKROCZYLEM LIMIT!!!!\n");
}
// Ju� sprawdzi�em, wi�c wracam z tym klawiszem
stan[ klawisze[klaw][1] ] = (stan[ klawisze[klaw][1] ]+1) % 2;
stan[ klawisze[klaw][2] ] = stan[ klawisze[klaw][1] ];
}
}
}
}
// Zapisalem wszystkie stany, teraz trzeba to podliczyc:
SUM=0;
for (int ii=0; ii<=1050000; ii++) if (bylo[ii]==1) SUM++;
/*
printf("Wypis:\n");
for (int ii=0; ii<=1050000; ii++) if (bylo[ii]==1)
{
stan_z_liczby(ii);
for (int jj=1; jj<=n; jj++) printf("%d ",stan[jj]);
printf("\n");
}
*/
//printf("W sumie mozliwe stany to: %ld\n",SUM);
printf("%ld",SUM);
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <stdio.h> //#include <conio.h> long n,m,klawisze[400001][3],liczba; char stan[200001],stop; char bylo[1050001]; // Maksymalnie dla n==20 long teraz[200001],pozniej[200001], SUM; long liczba_ze_stanu() { long LL=stan[1]; for (int qwe=2; qwe<=n; qwe++) LL=LL*2+stan[qwe]; return LL; } int stan_z_liczby(long liczba) { for (int qwe=n; qwe>=1; qwe--) { stan[qwe] = liczba % 2; liczba = liczba/2; } return 0; } int main() { scanf("%ld",&n); scanf("%ld",&m); for (int ii=1; ii<=n; ii++) scanf("%d",&stan[ii]); for (int ii=1; ii<=m; ii++) scanf("%ld %ld",&klawisze[ii][1], &klawisze[ii][2]); if (m==0) {printf("1"); return 0;} for (int ii=0; ii<=1050000; ii++) bylo[ii]=0; // Zamieniam stan na liczb�: pozniej[0]=1; pozniej[pozniej[0]]=liczba_ze_stanu(); bylo[ pozniej[pozniej[0]] ] = 1; stop=0; while (!stop) { for (int ii=0; ii<=pozniej[0]; ii++) teraz[ii] = pozniej[ii]; pozniej[0]=0; if (teraz[0]==0) stop=1; // Po kolei sprawdzam zapisane stany: for (int ter=1; ter<=teraz[0]; ter++) { // Na podstawie liczby tworz� dany stan: stan_z_liczby(teraz[ter]); // printf("Biezaca liczba: %ld\n",teraz[ter]); // printf("Stan: "); for (int ii=1; ii<=n; ii++) printf("%d ",stan[ii]); // printf("\n\n"); // Teraz po kolei pr�buj� ka�dego z przycisk�w i sprawdzam, czy kt�ry� mo�e zadzia�a�. for (int klaw=1; klaw<=m; klaw++) { if ( stan[ klawisze[klaw][1] ] == stan [ klawisze[klaw][2] ] ) { // printf("Zadzialal klawisz (%ld,%ld)\n",klawisze[klaw][1],klawisze[klaw][2]); // getch(); // Ten zadzia�a, wi�c chwilowo w��czam ten klawisz stan[ klawisze[klaw][1] ] = (stan[ klawisze[klaw][1] ]+1) % 2; stan[ klawisze[klaw][2] ] = stan[ klawisze[klaw][1] ]; // Sprawdzam, czy ten stan ju� wcze�niej by� rozpatrywany: liczba = liczba_ze_stanu(); if (bylo[liczba]==0) { // Tego stanu jeszcze nie by�o - zapisuj� do zrobienia p�niej pozniej[0]++; pozniej[pozniej[0]] = liczba; bylo[liczba]=1; // if (pozniej[0] >=200000) printf("PRZEKROCZYLEM LIMIT!!!!\n"); } // Ju� sprawdzi�em, wi�c wracam z tym klawiszem stan[ klawisze[klaw][1] ] = (stan[ klawisze[klaw][1] ]+1) % 2; stan[ klawisze[klaw][2] ] = stan[ klawisze[klaw][1] ]; } } } } // Zapisalem wszystkie stany, teraz trzeba to podliczyc: SUM=0; for (int ii=0; ii<=1050000; ii++) if (bylo[ii]==1) SUM++; /* printf("Wypis:\n"); for (int ii=0; ii<=1050000; ii++) if (bylo[ii]==1) { stan_z_liczby(ii); for (int jj=1; jj<=n; jj++) printf("%d ",stan[jj]); printf("\n"); } */ //printf("W sumie mozliwe stany to: %ld\n",SUM); printf("%ld",SUM); return 0; } |
English