#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];
}
}
}
//obrot w prawo 0 270
// 0,0 x=N-1 y=0 , 0,1 x=N-2, y=0
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];
}
}
}
//obrot w lewo 270
//0,0- x=0 y=N-1 0,1 x=1 y=N-1
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;
}
}
}
//obrot 90
//0,0- x=N-1 y=N-1 0,1 x=N-1 y=N-2
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]);
}
}
}
//obrot 180
//0,0- x=N-1 y=N-1 0,1 x=N-1 y=N-2
// 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]);
}
}
}
//transpose _main
// 0,0 x=0 y,0 0,1 x=1, y=0;
// 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;
}
//transpose secondary
//0,0 x=N-1, y=N-1, 0,1 x=N-2, y=N-1
// 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]);
}
}
}
//odbicie poziome
//0,0 x=N-1, y=0; 0,1 x=N-1, y=1
// 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]);
}
}
}
//odbicie poziome
// 0,0 x=0, y=N-1, 0,1 x=0, y=N-2
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 wynik(string str,int &wspx,int &wspy, int &wsx, int &wsy ,int N)
{
int dl=str.length(),i=0,obrot=0,pomx,pomy;
//for(i=0;i<dl-1;i++)
while(i<dl-1)
{
switch(str[i])
{
case 'A':
//for (int i = 0; i < N; i++) {
// for (int j = 0; j < N; j++) {
//rotatedMatrix[i][j] = matrix[N - j - 1][i];
//cout<<"A"<<endl;
pomx=wspx;
pomy=wspy;
wspx=N-pomy-1;
wspy=pomx;
pomx=wsx;
pomy=wsy;
wsx=N-pomy-1;
wsy=pomx;
break;
case 'B'://rotate180(matrix,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]);
//cout<<"B"<<endl;
pomx=wspx;
pomy=wspy;
wspx=N-pomx-1;
wspy=N-pomy-1;
pomx=wsx;
pomy=wsy;
wsx=N-pomx-1;
wsy=N-pomy-1;
break;
case 'C':
// for(int i = 0; i < N; i++) {
// for(int j = 0; j < N; j++) {
// rotatedMatrix[i][j] = matrix[j][N - i - 1];
pomx=wspx;
pomy=wspy;
wspx=pomy;
wspy=N-pomx-1;
pomx=wsx;
pomy=wsy;
wsx=pomy;
wsy=N-pomx-1;
//cout<<"C"<<endl;
break;
case 'X':
//rotatedMatrix[i][j] = matrix[j][N - i - 1];
pomx=wspx;
pomy=wspy;
wspx=pomy;
wspy=N-pomx-1;
pomx=wsx;
pomy=wsy;
wsx=pomy;
wsy=N-pomx-1;
//cout<<"X"<<endl;
break;
case 'Y':
pomx=wspx;
pomy=wspy;
wspx=N-pomx-1;
wspy=N-pomy-1;
pomx=wsx;
pomy=wsy;
wsx=N-pomx-1;
wsy=N-pomy-1;
//cout<<"Y"<<endl;
break;
case 'Z':
//cout<<"Z"<<endl;
pomx=wspx;
pomy=wspy;
wspx=N-pomy-1;
wspy=pomx;
pomx=wsx;
pomy=wsy;
wsx=N-pomy-1;
wsy=pomx;
break;
case 'T':
//transpose _main
// 0,0 x=0 y,0 0,1 x=1, y=0;
//cout<<'T'<<" "<<wspx<<" "<<wspy<<" "<<wsx<<" "<<wsy<<endl;
pomx=wspx;
pomy=wspy;
wspx=pomy;
wspy=pomx;
pomx=wsx;
pomy=wsy;
wsx=pomy;
wsy=pomx;
//cout<<'T'<<" "<<wspx<<" "<<wspy<<" "<<wsx<<" "<<wsy<<endl;
// cout<<"T"<<endl;
break;
case 'D':
//cout<<"D"<<endl;
//temp[N-j-1][N-i-1]=matrix[i][j];
pomx=wspx;
pomy=wspy;
wspx=N-pomy-1;
wspy=N-pomx-1;
pomx=wsx;
pomy=wsy;
wsx=N-pomy-1;
wsy=N-pomx-1;
break;
case 'V':
//swap(matrix[i][j], matrix[i][N-j-1]);
pomx=wspx;
pomy=wspy;
wspx=pomx;
wspy=N-pomy-1;
pomx=wsx;
pomy=wsy;
wsx=pomx;
wsy=N-pomy-1;
//cout<<"H"<<endl;
cout<<'H'<<" "<<wspx<<" "<<wspy<<" "<<wsx<<" "<<wsy<<endl;
break;
case 'H':
//swap(matrix[i][j], matrix[N-i-1][j]);
pomx=wspx;
pomy=wspy;
wspx=N-pomx-1;
wspy=pomy;
pomx=wsx;
pomy=wsy;
wsx=N-pomx-1;
wsy=pomy;
//cout<<"V"<<endl;
break;
}
i++;
}
}
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]<<" ";
i++;
}
}
cout<<endl;
}
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.length()<<endl;
//cout<<str<<endl;
int wspx=0,wspy=0,wsx=0,wsy=1,pomx,pomy,pox,poy;
//analiza(str,matrix,N);
wynik(str,wspx,wspy,wsx,wsy,N);
cout<<wspx<<" "<<wspy<<" "<<wsx<<" "<<wsy<<" "<<wsx-wspx<<" "<<wsy-wspy<<endl;
//odzyskaj macierz po dwóch elementach
//for (int i = 0; i < N; i++) {
// for (int j = 0; j < N; j++) {
if(wspx==0)//ta sama kolumna
{
if(wspy==0) //bez zmian?
{
if(wsx==1)
transpose_main( matrix,N);
}
else
{
if(wsx==0) //ta sama kolumna wiersz wyzej
{
//V
// cout<<"H"<<endl;
//flipHorizontal(matrix,N);
flipVertical(matrix,N);
}
else
{
// cout<<"C"<<endl;
// cout<<wspx<<" "<<wspy<<" "<<wsx<<" wsy"<<endl;
obrot_w_prawo_270(matrix,N);
}//wiersz dolny kolumna obok
}
}//kolumna ostatnia
else
{
if(wspy==0) //pierwszy wiersz
{
if(wsx==N-1)
{
//H
//cout<<"V"<<endl;
flipHorizontal(matrix,N);
//flipVertical(matrix,N);
}
else
{
//cout<<"A"<<endl;
rotateRight(matrix,N) ;
}
}
else
{
//ostatni wiersz
if(wsy==N-1)
{
//D
transpose_secondary( matrix,N);
}
else
{
//B
rotate180(matrix,N);
}
}
}
// }
//}
//cout<<"po:"<<endl;
wypisz_macierz(matrix,N);
cout<<endl;
}
return 0;
}