#include #include int N; char puvodni_deska[200][200]; char deska[200][200]; int prazdna[3][2]; // souřadnice tří prázdných polí void nacti_vstup() { scanf("%d\n", &N); int prazdnych = 0; // nalezených prázdných políček for (int r = 0; r < N; r++) { for (int c = 0; c < N; c++) { char val = getchar(); puvodni_deska[r][c] = val; if (val == '.') { if (prazdnych >= 3) abort(); prazdna[prazdnych][0] = r; prazdna[prazdnych][1] = c; prazdnych++; } } if (getchar() != '\n') abort(); // sežrat konec řádku (a zkontrolovat, že tam je) } if (prazdnych != 3) abort(); } void tahni(int r, int c, char kdo) { deska[r][c] = kdo; for (int dr = -1; dr <= 1; dr++) { // Pro každý z for (int dc = -1; dc <= 1; dc++) { // osmi směrů... if (dr == 0 && dc == 0) continue; // (0, 0) není platný směr, nýbrž stání na místě int nr = r, nc =c; while (1) { nr += dr; nc += dc; if (nr < 0 || nc < 0 || nr >= N || nc >= N) break; // Narazili jsme na kraj desky -> nic se nestane if (deska[nr][nc] == '.') break; // Narazili jsme na volné pole -> nic se nestane if (deska[nr][nc] == kdo) { // Narazili jsme na kámen vlastní barvy -> přebarvit prošlá pole while (1) { nr -= dr; // vracíme se zpátky, kudy jsme přišli, cestou přebarvujeme kameny nc -= dc; if (nr == r && nc == c) break; // vrátili jsme se na původní políčko -> hotovo deska[nr][nc] = kdo; // přebarvit kámen na vlastní barvu } break; } } } } } // Táhni na i-té prázdné políčko (číslováno na začátku hry) void tahni_na_prazdne(int i, char kdo) { tahni(prazdna[i][0], prazdna[i][1], kdo); } int simuluj_hru(int tah1, int tah2, int tah3) { // (1) Zkopíruj desku for (int r = 0; r < N; r++) { for (int c = 0; c < N; c++) { deska[r][c] = puvodni_deska[r][c]; } } // (2) Odsimuluj průběh hry tahni_na_prazdne(tah1, 'K'); // první táhne Kevin tahni_na_prazdne(tah2, 'P'); tahni_na_prazdne(tah3, 'K'); // (3) Spočti Kevinovy kameny int kamenu = 0; for (int r = 0; r < N; r++) { for (int c = 0; c < N; c++) { if (deska[r][c] == 'K') kamenu++; } } return kamenu; } int vyres() { int tah1, tah2, tah3; int maximum1; for (tah1 = 0; tah1 < 3; tah1++) { // Kevin vyzkouší všechny tři možné tahy... (K) int minimum2 = N*N + 1; for (tah2 = 0; tah2 < 3; tah2++) { // Petr vyzkouší táhnout na všechna tři políčka... if (tah1 == tah2) continue; // ... nesmí táhnout na stejné jako kevin... (P) int kamenu; for (tah3 = 0; tah3 < 3; tah3++) { // Kevin najde jediné zbývající volné pole... if (tah3 == tah1 || tah3 == tah2) continue; int kamenu = simuluj_hru(tah1, tah2, tah3); // ... a na něj táhne. break; } if (kamenu < minimum2) minimum2 = kamenu; // (P) ... a táhne tak, aby Kevin na konci } // získal co nejméně kamenů if (minimum2 > maximum1) maximum1 = minimum2; // (K) ...a vybere si ten, kterým získá } // na konci nejvíce kamenů return maximum1; } int main() { nacti_vstup(); int maximum = vyres(); printf("%d\n", maximum); }