#include #include #include // Globální proměnné na vstup a výstup, // abychom si je pořád nemuseli předávat v argumentech. int n, m; int k; char **in; char **out; // Posune souřadnice v odpovídajícím směru. // Nekontroluje, zda-li to je možné (zeď, kraj mapy…) void forward(int *x, int *y, int s) { if (s == 0) ++*y; if (s == 1) ++*x; if (s == 2) --*y; if (s == 3) --*x; } // Je na tyto souřadnice možné vstupit? bool empty(int x, int y) { // Ne, protože to je za krajem mapy if (x < 0 || y < 0 || x >= n || y >= m) return false; // Podle toho, zda tam je zeď return in[x][y]!='#'; } // Provede jeden krok dozorce. void step(int *x, int *y, int *s) { // X a Y jsou nové souřadnice dozorce… int X = *x, Y = *y; // …po provedení jednoho kroku forward(&X, &Y, *s); // Pokud na ně mohl vstoupit, ponechá si je, if(empty(X,Y)) *x = X, *y = Y; // jinak se otočí else *s = (*s + 1)%4; } int main(int argc, char ** argv) { scanf("%d%d%d", &n,&m,&k); // Naalokujeme pole polí na vstup a výstup in = malloc(n*sizeof(in[0])); for (size_t i = 0; i < n; ++i) in[i] = malloc(m*sizeof(out[i][0])); out = malloc(n*sizeof(out[0])); for (size_t i = 0; i < n; ++i) out[i] = malloc(m*sizeof(out[i][0])); // Přečteme vstup for (size_t i = 0; i < n; ++i) scanf(" %s", in[i]); // Zdi překopírujeme na výstup for (size_t i = 0; i < n; ++i) for (size_t j = 0; j < m; ++j) if (in[i][j] == '#') out[i][j] = '#'; else out[i][j] = '.'; // Pro každé políčko mapy… for (size_t i = 0; i < n; ++i) for (size_t j = 0; j < m; ++j) // …pokud na něm stojí dozorce… if(in[i][j] != '#' && in[i][j] != '.') { int s = -1; if(in[i][j] == '>') s = 0; if(in[i][j] == 'V') s = 1; if(in[i][j] == '<') s = 2; if(in[i][j] == 'A') s = 3; // Provádí simulaci s želvou a zajícem int x = i, y = j; // želva int z_x = x, z_y = y, z_s = s; // zajíc int t = 0; while (true) { t++; step(&x, &y, &s); step(&z_x, &z_y, &z_s); if(x == z_x && y == z_y && s == z_s && t != 1) { // Když se někam dostaneme za t i za 2t-1 kroků, tak tam budeme i za: t = t + ((k - t)/(t - 1))*(t - 1); } step(&z_x, &z_y, &z_s); if(t == k) break; if(x == z_x && y == z_y && s == z_s) { // Když se někam dostaneme za t i za 2t kroků, tak tam budeme i za: t = ((k - 1)/t)*t; } } // Na konečné pozici želvy končí dozorce out[x][y] = 'X'; } for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j < m; ++j) printf("%c", out[i][j]); printf("\n"); } return 0; }