#include <iostream>
#include <vector>
using namespace std;
void wypisz_macierz(vector<vector<char>>& macierz, int N) {
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
cout << macierz[i][j];
}
cout << endl;
}
}
void obrot_w_prawo_270(vector<vector<char>>& matrix, int N) {
//int temp[N][N];
vector<vector<char>> temp(N, vector<char>(N, 0));
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
temp[N-j-1][i] = matrix[i][j];
}
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
matrix[i][j] = temp[i][j];
}
}
}
void obrot_w_lewo_270(vector<vector<char>>& matrix, int N) {
vector<vector<char>> temp(N, vector<char>(N, 0));
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
temp[j][N-i-1] = matrix[i][j];
}
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
matrix[i][j] = temp[i][j];
}
}
}
void obracanieMacierzy(int n, char** macierz) {
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < n; j++) {
int temp = macierz[i][j];
macierz[i][j] = macierz[n - i - 1][n - j - 1];
macierz[n - i - 1][n - j - 1] = temp;
}
}
if (n % 2 != 0) {
for (int j = 0; j < n / 2; j++) {
int temp = macierz[n / 2][j];
macierz[n / 2][j] = macierz[n / 2][n - j - 1];
macierz[n / 2][n - j - 1] = temp;
}
}
}
void rotate180(vector<vector<char>>& matrix, int N) {
for (int i = 0; i < N/2; i++) {
for (int j = 0; j < N; j++) {
swap(matrix[i][j], matrix[N-i-1][N-j-1]);
}
}
if (N%2 == 1) {
int mid = N/2;
for (int j = 0; j < mid; j++) {
swap(matrix[mid][j], matrix[mid][N-j-1]);
}
}
}
// Funkcja obraca macierz o 180 stopni w lewo
void rotate180_left(vector<vector<char>>& matrix,int N) {
for (int i = 0; i < N/2; i++) {
for (int j = 0; j < N; j++) {
swap(matrix[i][j], matrix[N-i-1][N-j-1]);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N/2; j++) {
swap(matrix[i][j], matrix[i][N-j-1]);
}
}
for (int i = 0; i < N/2; i++) {
for (int j = i+1; j < N; j++) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
// Funkcja wykonuje transpozycjê macierzy wzglêdem g³ównej przek¹tnej
void transpose_main(vector<vector<char>>& matrix,int N) {
for (int i = 0; i < N; i++) {
for (int j = i+1; j < N; j++) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
// Funkcja wykonuje transpozycjê macierzy wzglêdem drugiej przek¹tnej
void transpose_secondary(vector<vector<char>>& matrix,int N) {
vector<vector<char>> temp(N, vector<char>(N));
for(int i = 0;i < N;i++){
for (int j = 0; j < N; j++) {
// cout<<N-j-1<<" "<<N-i-1<<endl;
temp[N-j-1][N-i-1]=matrix[i][j];
}
}
matrix=temp;
}
// funkcja do odbicia poziomego macierzy
void flipVertical(vector<vector<char>>& matrix,int N) {
for (int i = 0; i < N/2; i++) {
for (int j = 0; j < N; j++) {
swap(matrix[i][j], matrix[N-i-1][j]);
}
}
}
// funkcja do odbicia pionowego macierzy
void flipHorizontal(vector<vector<char>>& matrix,int N) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N/2; j++) {
swap(matrix[i][j], matrix[i][N-j-1]);
}
}
}
void rotateRight(vector<vector<char>>& matrix, int N) {
// utworzenie nowej macierzy z obróconymi elementami
vector<vector<char>> rotatedMatrix(N, vector<char>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
rotatedMatrix[i][j] = matrix[N - j - 1][i];
}
}
// przypisanie nowej macierzy do oryginalnej
matrix = rotatedMatrix;
}
void rotateLeft(vector<vector<char>>& matrix, int N) {
// utworzenie nowej macierzy z obróconymi elementami
vector<vector<char>> rotatedMatrix(N, vector<char>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
rotatedMatrix[i][j] = matrix[j][N - i - 1];
}
}
// przypisanie nowej macierzy do oryginalnej
matrix = rotatedMatrix;
}
void transpose(vector<vector<char>>& matrix, int N) {
// zamiana elementów macierzy wzglêdem g³ównej przek¹tnej
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
void analiza(string str,vector<vector<char>>& matrix, int N)
{
int dl=str.length(),i=0,obrot=0;
//for(i=0;i<dl-1;i++)
while(i<dl-1)
{
//cout<<"jestem"<<endl;
while(str[i]=='A'||str[i]=='B'||str[i]=='C'||str[i]=='X'||str[i]=='Y'||str[i]=='Z')
{
switch (str[i])
{
case 'A':obrot+=90 ;
break;
case 'B':obrot+=180;
break;
case 'C':obrot+=270;
break;
case 'X':obrot+=-90;
break;
case 'Y':obrot+=-180;
break;
case 'Z':obrot+=-270;
break;
}
i++;
}
obrot=obrot%360;
cout<<obrot<<endl;
switch(obrot)
{
case 90:rotateRight(matrix,N) ;
break;
case 180:rotate180(matrix,N);
break;
case 270:obrot_w_prawo_270(matrix,N);
break;
case -90:rotateLeft(matrix,N);
break;
case -180:rotate180(matrix,N);
break;
case -270:obrot_w_lewo_270(matrix,N);
}
obrot=0;
while(i<dl-1 && str[i]==str[i+1])i=i+2;
//cout<<i<<endl;
if(i<dl-1 && (str[i]=='T'||str[i]=='D'||str[i]=='H'||str[i]=='V'))
{
//cout<<"tu"<<endl;
switch(str[i])
{
case 'T':transpose_main(matrix,N);
break;
case 'D':transpose_secondary( matrix,N);
break;
case 'H':flipHorizontal(matrix,N);
break;
case 'V':flipVertical(matrix,N);
break;
}
cout<<"wyk="<<str[i]<<endl;
i++;
}
}
}
void analize(string str,vector<vector<char>>& matrix, int N)
{
int dl=str.length(),i;
cout<<"dl="<<dl<<endl;
for(i=0;i<dl-1;i++)
{
switch(str[i])
{
case 'A':rotateRight(matrix,N) ;
//cout<<"A"<<endl;
break;
case 'B':rotate180(matrix,N);
//cout<<"B"<<endl;
//wypisz_macierz(matrix,N);
break;
case 'C':obrot_w_prawo_270(matrix,N);
//cout<<"C"<<endl;
break;
case 'X':rotateLeft(matrix,N);
//cout<<"X"<<endl;
break;
case 'Y':rotate180(matrix,N);
//cout<<"Y"<<endl;
break;
case 'Z':obrot_w_lewo_270(matrix,N);
//cout<<"Z"<<endl;
break;
case 'T':transpose_main(matrix,N);
// cout<<"T"<<endl;
break;
case 'D':transpose_secondary( matrix,N);
//cout<<"D"<<endl;
break;
case 'H':flipHorizontal(matrix,N);
//cout<<"H"<<endl;
break;
case 'V':flipVertical(matrix,N);
//cout<<"V"<<endl;
break;
case '&':
//cout<<"&"<<endl;
break;
}
}
cout<<i<<endl;
}
int main() {
ios_base::sync_with_stdio(false);
int N,t,dl,obrot=0;
string str;
cin>>t;
while(t--)
{
cin >> N;
//cout<<N<<endl;
// wczytanie macierzy
vector<vector<char>> matrix(N, vector<char>(N));
//cout<<matrix.size()<<endl;
//vector<vector<char>> matrix2(N, vector<char>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> matrix[i][j];
}
}
// matrix2=matrix;
cin>>str;
cout<<str<<endl;
analiza(str,matrix,N);
//cout<<"po:"<<endl;
wypisz_macierz(matrix,N);
cout<<endl;
}
return 0;
}
// transpozycja wzglêdem g³ównej przek¹t