//TWORZENIE MACIERZY : PROBLEM A, AUTOR URSZULA SKOTNY
#include <iostream>
#include <fstream>
#include <string>
//#include "stdafx.h"
using namespace std;
void T(char **M_pocz, int rozmiarMacierzy);
void D(char **M_pocz, int rozmiarMacierzy);
void H(char **M_pocz, int rozmiarMacierzy);
void V(char **M_pocz, int rozmiarMacierzy);
void A(char **M_pocz, int rozmiarMacierzy);
void B(char **M_pocz, int rozmiarMacierzy);
void C(char **M_pocz, int rozmiarMacierzy);
void X(char **M_pocz, int rozmiarMacierzy);
void Y(char **M_pocz, int rozmiarMacierzy);
void Z(char **M_pocz, int rozmiarMacierzy);
void Show(char **M_pocz, int rozmiarMacierzy);
int main(int argc, char*argv[])
{
string linia;
getline(cin, linia);
int iloscTestow = stoi(linia); // Funkcja stoi konwertuje sekwencję znaków w _Str do wartości typu int i zwraca wartość
for (int i = 0; i < iloscTestow; i++) // mowię ile razy ma sie wykonać - czyli ilośc testow
{
// pobranie rozmiaru macierzy
getline(cin, linia);
int rozmiarMacierzy = stoi(linia);
// alokacja pamieci odpowiednio przydział i zwolnienie ciągłego obszaru pamięci.
char **macierz = new char*[rozmiarMacierzy];
for (int j = 0; j < rozmiarMacierzy; j++)
{
macierz[j] = new char[rozmiarMacierzy];
}
// wczytanie danych z pliku wejsciowego
for (int j = 0; j < rozmiarMacierzy; j++)
{
getline(cin, linia);
for (int k = 0; k < rozmiarMacierzy; k++)
{
macierz[j][k] = linia[k];
}
}
string operacje;
getline(cin, operacje); // bierz skad i co
int iloscOperacji = operacje.length() - 1;
for (int j = 0; j < iloscOperacji; j++)
{
switch (operacje[j])
{
case 'T':
T(macierz, rozmiarMacierzy);
break;
case 'D':
D(macierz, rozmiarMacierzy);
break;
case 'H':
H(macierz, rozmiarMacierzy);
break;
case 'V':
V(macierz, rozmiarMacierzy);
break;
case 'A':
A(macierz, rozmiarMacierzy);
break;
case 'B':
B(macierz, rozmiarMacierzy);
break;
case 'C':
C(macierz, rozmiarMacierzy);
break;
case 'X':
X(macierz, rozmiarMacierzy);
break;
case 'Y':
Y(macierz, rozmiarMacierzy);
break;
case 'Z':
Z(macierz, rozmiarMacierzy);
break;
}
}
// zapis do pliku wyjsciowego
for (int j = 0; j < rozmiarMacierzy; j++)
{
for (int k = 0; k < rozmiarMacierzy; k++)
{
cout << (char)macierz[j][k];
}
cout << endl;
}
}
}
void T(char **M_pocz, int rozmiarMacierzy)
// M_pocz - macierz pocżatkowa. czyli wejściowa
{
char **m_pocz = new char *[rozmiarMacierzy];
//m_pocz - macierz końcowa, czyli wyjściowa
for (int i = 0; i < rozmiarMacierzy; i++) m_pocz[i] = new char[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++)
{
for(int j=0; j< rozmiarMacierzy; j++)
{
m_pocz[j][i] = M_pocz[i][j];
}
}
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
M_pocz[i][j] = m_pocz[i][j];
}
}
}
void D(char **M_pocz, int rozmiarMacierzy)
{
char **m_pocz = new char*[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++) m_pocz[i] = new char[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
m_pocz[rozmiarMacierzy - j - 1][rozmiarMacierzy - i - 1] = M_pocz[i][j];
}
}
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
M_pocz[i][j] = m_pocz[rozmiarMacierzy- i-1][j];
}
}
}
void H(char **M_pocz, int rozmiarMacierzy)
{
char **m_pom = new char *[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++) m_pom[i] = new char[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
m_pom[i][rozmiarMacierzy - j - 1] = M_pocz[i][j];
}
}
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
M_pocz[i][j] = m_pom[rozmiarMacierzy - j - 1][i];
}
}
}
void V(char **M_pocz, int rozmiarMacierzy)
{
char **m_pom = new char *[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++) m_pom[i] = new char[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j <rozmiarMacierzy; j++)
{
m_pom[rozmiarMacierzy - i - 1][j] = M_pocz[i][j];
}
}
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j <rozmiarMacierzy; j++)
{
M_pocz[i][j] = m_pom[j][rozmiarMacierzy - i - 1];
}
}
}
void A(char ** M_pocz, int rozmiarMacierzy) //Obrót w prawo o 90st
{
char **m_pom = new char *[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++)
m_pom[i] = new char[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j <rozmiarMacierzy; j++)
{
m_pom[j][rozmiarMacierzy - i - 1] = M_pocz[i][j];
}
}
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
M_pocz[i][j] = m_pom[i][j];
}
}
}
void B(char ** M_pocz, int rozmiarMacierzy ) // obrót w prawo o 180st
{
for (int i = 0; i < 2; i++) A(M_pocz, rozmiarMacierzy); // wykorzystanie sposobu z A- skracanie kodu
}
void C(char ** M_pocz, int rozmiarMacierzy) // obrót o 270st w prawo
{
for (int i = 0; i < 3; i++) A(M_pocz,rozmiarMacierzy );
}
void X(char ** M_pocz, int rozmiarMacierzy) // obrót w lewo o 90
{
char **m_pom = new char *[rozmiarMacierzy];
for (int i = 0; i < rozmiarMacierzy; i++) m_pom[i] = new char[rozmiarMacierzy];
for (int i = 0; i <rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
m_pom[rozmiarMacierzy - j - 1][i] = M_pocz[i][j];
}
}
for (int i = 0; i <rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
M_pocz[i][j] = m_pom[i][j];
}
}
}
void Y(char **M_pocz, int rozmiarMacierzy) // obrót w lewo o 180
{
for (int i = 0; i < 2; i++) X(M_pocz, rozmiarMacierzy); // wykorzystanie fukcji X
}
void Z(char **M_pocz, int rozmiarMacierzy)
{
for (int i = 0; i < 3; i++) X(M_pocz, rozmiarMacierzy);
}
void Show(char **M_pocz, int rozmiarMacierzy)
{
for (int i = 0; i < rozmiarMacierzy; i++)
{
for (int j = 0; j < rozmiarMacierzy; j++)
{
cout << "[" << M_pocz[i][j] << "]\t";
}
cout << endl;
}
}