#include #define pol(r, s, S) ((r)*(S)+(s)) #define FOR(i,a,b) for (int i = (a); i < (b); ++i) char tab[300][300]; // size is RS x RS+1 int R, S; void load(int R, int S) { char vstup[50]; FOR (r, 0, R) { scanf("%s", vstup); FOR (s, 0, S) { tab[pol(r, s, S)][R*S] = (vstup[s] == '.' ? 0 : 1); tab[pol(r, s, S)][pol(r, s, S)] = 1; if (s != 0) tab[pol(r, s, S)][pol(r, s-1, S)] = 1; if (s != S-1) tab[pol(r, s, S)][pol(r, s+1, S)] = 1; if (r != 0) tab[pol(r, s, S)][pol(r-1, s, S)] = 1; if (r != S-1) tab[pol(r, s, S)][pol(r+1, s, S)] = 1; } } } void print() { FOR(y, 0, R*S) { FOR (x, 0, R*S+1) printf("%d ", tab[y][x]); printf("\n"); } printf("\n"); } void eliminuj(int riadok) { FOR (r, 0, R*S) { if (r != riadok && tab[r][riadok] == 1) { FOR (s, riadok, R*S+1) tab[r][s] = (tab[r][s] + tab[riadok][s]) % 2; // printf("elim %d pre %d:\n", riadok, r); // print(); } } } void swap(int riadok1, int riadok2, int stlpec) { int pom; FOR(s, stlpec, R*S+1) { pom = tab[riadok1][s]; tab[riadok1][s] = tab[riadok2][s]; tab[riadok2][s] = pom; } } bool jednicka(int riadok) { if (tab[riadok][riadok] == 1) return 0; bool ok = true; FOR (r, riadok, R*S) if (tab[r][riadok] == 1) { swap(r, riadok, riadok); ok = false; break; } return ok; } int gem(int riadok) { FOR (r, riadok, R*S) { if (jednicka(r)) return r; eliminuj(r); } return 0; } int main() { scanf("%d", &R); int gemret; while (R != 0) { scanf("%d", &S); FOR (x, 0, R*S) FOR (y, 0, R*S+1) tab[x][y] = 0; load(R, S); // printf("poloade:\n"); // print(); if (!(gemret = gem(0))) { int sum = 0; FOR(r, 0, R*S) sum += tab[r][R*S]; printf("You have tap to %d tiles.\n", sum); scanf("%d", &R); break; } int volnych = R*S-gemret; FOR (r, gemret, R*S) { tab[r][r] = 1; tab[r][R*S] = 0; } if (!gem(gemret)) { int sum = 0; FOR(r, 0, R*S) sum += tab[r][R*S]; printf("You have tap to %d tiles.\n", sum); scanf("%d", &R); break; } else { printf("Damaged billboard.\n"); } scanf("%d", &R); } }