#include using namespace std; typedef long long int ll; typedef long double ld; typedef pair ii; typedef vector vi; typedef vector vii; #define PB push_back #define FOR(prom,a,b) for( ll prom = (a); prom < (ll)(b); ++prom ) #define F(a) FOR(i,0,a) #define FF(a) FOR(j,0,a) #define EPS (1e-10) #define INF ((1<<30)-1) #define EQ(a,b) (fabs(a-b)/fabs(a+b) < EPS) map > symbolChange = { { '<', { { '<', 'v' }, { 'v', '>' }, { '>', '^' }, { '^', '<' }, { 'o', 'o' }, { 'x', 'x' }, { '|', '-' }, { '-', '|' }, { '/', '\\' }, { '\\', '/' } } }, { '>', { { '<', '^' }, { 'v', '<' }, { '>', 'v' }, { '^', '>' }, { 'o', 'o' }, { 'x', 'x' }, { '|', '-' }, { '-', '|' }, { '/', '\\' }, { '\\', '/' } } }, { '-', { { '<', '<' }, { 'v', '^' }, { '>', '>' }, { '^', 'v' }, { 'o', 'o' }, { 'x', 'x' }, { '|', '|' }, { '-', '-' }, { '/', '\\' }, { '\\', '/' } } }, { '|', { { '<', '>' }, { 'v', 'v' }, { '>', '<' }, { '^', '^' }, { 'o', 'o' }, { 'x', 'x' }, { '|', '|' }, { '-', '-' }, { '/', '\\' }, { '\\', '/' } } }, { '/', { { '<', 'v' }, { 'v', '<' }, { '>', '^' }, { '^', '>' }, { 'o', 'o' }, { 'x', 'x' }, { '|', '-' }, { '-', '|' }, { '/', '/' }, { '\\', '\\' } } }, { '\\', { { '<', '^' }, { 'v', '>' }, { '>', 'v' }, { '^', '<' }, { 'o', 'o' }, { 'x', 'x' }, { '|', '-' }, { '-', '|' }, { '/', '/' }, { '\\', '\\' } } }, }; struct Matrix { array, 3> data; Matrix & operator *= ( const Matrix & m ) { array, 3> tmp = array, 3>{ array{ 0, 0, 0 }, array{ 0, 0, 0 }, array{ 0, 0, 0 } }; F(3)FF(3)FOR(k,0,3) { tmp[i][j] += m.data[i][k] * data[k][j]; } data = tmp; return *this; } array operator* ( const array & v ) { array result { 0,0,0}; F(3)FF(3) { result[ i ] += v[ j ] * data[ i ][ j ]; } return result; } void print ( void ) { // F(3) { FF(3) { // cerr << data[i][j] << " "; // } cerr << endl; } cerr << endl; } }; Matrix RCCW, RCW, SHOR, SVER, FMAIN, FSEC; int main () { ios::sync_with_stdio(false); RCCW.data = array, 3>{ array{ 0, -1, 0 }, array{ 1, 0, 0 }, array{ 0, 0, 1 } }; RCW.data = array, 3>{ array{ 0, 1, 0 }, array{ -1, 0, 0 }, array{ 0, 0, 1 } }; SHOR.data = array, 3>{ array{ 1, 0, 0 }, array{ 0, -1, 0 }, array{ 0, 0, 1 } }; SVER.data = array, 3>{ array{ -1, 0, 0 }, array{ 0, 1, 0 }, array{ 0, 0, 1 } }; FMAIN.data = array, 3>{ array{ 0, 1, 0 }, array{ 1, 0, 0 }, array{ 0, 0, 1 } }; FSEC.data = array, 3>{ array{ 0, -1, 0 }, array{ -1, 0, 0 }, array{ 0, 0, 1 } }; ll N; while ( cin >> N ) { map trans = { { '<', '<' }, { 'v', 'v' }, { '>', '>' }, { '^', '^' }, { 'o', 'o' }, { 'x', 'x' }, { '|', '|' }, { '-', '-' }, { '/', '/' }, { '\\', '\\' } }; Matrix T; T.data = array,3>{ array{ 1, 0, 0 }, array{ 0, 1, 0 }, array{ 0, 0, 1 } }; vector> pole(N, vector(N)); F(N)FF(N) { cin >> pole[i][j]; } T.print(); string s; ll ids = 0; getline(cin, s);getline(cin, s); while ( ids < s.size() ) { if ( s[ids] == ' ' ) { ids++; continue; } for ( auto it = trans.begin(); it != trans.end(); ++it ) { it->second = symbolChange[ s[ids] ][ it->second ]; } switch ( s[ids] ) { case '<': T *= RCCW; break; case '>': T *= RCW; break; case '|': T *= SHOR; break; case '-': T *= SVER; break; case '/': T *= FSEC; break; case '\\': T *= FMAIN; break; } T.print(); ids++; } vector> result(N, vector(N)); F(N)FF(N) { array newpos = array{ 0, 0, 0 }, pos = array{ 2 * i - ( N - 1 ), 2 * j - ( N - 1 ) }; newpos = T * pos; newpos[0] += N - 1; newpos[0] /= 2; newpos[1] += N - 1; newpos[1] /= 2; result[newpos[0]][newpos[1]] = trans[ pole[i][j] ]; } F(N) { FF(N) { cout << result[i][j]; } cout << endl; } } return 0; }