#include #include #include #define MAX_N 1000000 // Aby funkce mohla vracet dvě hodnoty, musíme je nějak zabalit typedef struct { int r; int s; } pozice; int K; // Vrací pozici transformovanou o daný počet otočení doprava pozice poziceDoprava(int otoceni, pozice puvodni) { // Transformace o jedno otočení doprava: // - řádkem je původní sloupec // - sloupcem je původní řádek počítaný od pravého okraje (nejpravější // políčko má index K-1) int r = puvodni.r; int s = puvodni.s; pozice nova; switch (otoceni) { case 0: nova.r = r; nova.s = s; break; case 1: nova.r = s; nova.s = K - 1 - r; break; case 2: nova.r = K - 1 - r; nova.s = K - 1 - s; break; case 3: nova.r = K - 1 - s; nova.s = r; } return nova; } // Vrací pozici transformovanou o daný počet otočení doleva // Otáčku o k vlevo získáme pomocí (4 - k) % 4 otočení doprava: (0,1,2,3)->(0,3,2,1) pozice poziceDoleva(int otoceni, pozice puvodni) { return poziceDoprava((4 - otoceni) % 4, puvodni); } int main() { ///////////////////// // 1. Načtení vstupu: char text[MAX_N]; scanf("%s\n", text); scanf("%d\n", &K); int delka = strlen(text); // Inicializace mřížky KxK a rovnou // (dvoudimenzionální pole charů == pole K ukazatelů na pole charů) char **mrizka = (char **)malloc(sizeof(char *)*K); for (int r = 0; r < K; r++) { mrizka[r] = (char *)malloc(sizeof(char)*K); for (int s = 0; s < K; s++) mrizka[r][s] = getchar(); scanf("\n"); } // Doplníme text na délku K*K: // Použijeme k tomu pomocné pole, ze kterého budeme vybírat písmena stále dokola char KSP[3] = {'K', 'S', 'P'}; for (int i = delka; i < K*K; i++) text[i] = KSP[(i - delka) % 3]; //////////////////////// // 2. Samotné šifrování: // Připravíme si 2D tabulku na výsledek char **vysledek = (char **)malloc(sizeof(char *)*K); for (int r = 0; r < K; r++) vysledek[r] = (char *)malloc(sizeof(char)*K); int znak = 0; for (int otoceni = 0; otoceni < 4; otoceni++) { for (int r = 0; r < K; r++) { for (int s = 0; s < K; s++) { // Otáčíme mřížkou doprava, což je stejné jako // kdybychom souřadné osy otočili o otáčku doleva. pozice puvodni; puvodni.r = r; puvodni.s = s; pozice nova = poziceDoleva(otoceni, puvodni); if (mrizka[nova.r][nova.s] == '.') { vysledek[r][s] = text[znak]; znak += 1; } } } } /////////////////////////////// // 3. Vypsání výsledné tabulky: for (int r = 0; r < K; r++) { for (int s = 0; s < K; s++) putchar(vysledek[r][s]); printf("\n"); } return 0; }