#include "testlib.h"

using namespace std;

const int MAXN = 100;

const int MAXLEN = 5000000;

const double PerTest = 1.0;

string cur[MAXN];
string need[MAXN];
                     

const int    dx[4] = {  1,  0, -1,  0};
const int    dy[4] = {  0,  1,  0, -1};
const char name[4] = {'d','r','u','l'};


int getScore(int x,int n){
	if (x <= 3*n*n) return 5;
	if (x <= 5*n*n) return 4;
	if (x <= 10*n*n) return 3;
	if (x <= 2.5*n*n*n) return 2;
	return 1;
}



int main(int argc,char** argv){
	registerTestlibCmd(argc,argv);

	int n = inf.readInt(1,MAXN);

	for (int i = 0; i < n; i++){
		need[i] = inf.readToken();
		cur[i] = string(n,'W');
	}

	cur[0][0] = 'B';

	string out;

	ouf.readTokenTo(out);

	if ((int)out.length() > MAXLEN)
		quitf(_pe,"Ответ слишком длинный");
                    
	int curx = 0, cury = 0;

	for (int i = 0; i < (int)out.size(); i++){
		for (int j = 0; j <= 4; j++){
			if (j == 4)
				quitf(_pe,"Некорректный ход %d : неизвестный символ %c", i+1, out[i]);
			if (name[j] == out[i] || name[j] == out[i] + 'a' - 'A'){
				 curx += dx[j];
				 cury += dy[j];

				 if (!(0 <= curx && 0 <= cury && curx < n && cury < n)){
				 	quitf(_wa,"Некорректный ход %d : выход за границу доски", i+1);
				 }

				 if ('A' <= out[i] && out[i] <= 'Z')
				 	cur[curx][cury] = cur[curx - dx[j]][cury - dy[j]];
				 break;
			}
		}	    

	}

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			if (cur[i][j] != need[i][j])
				quitf(_wa,"Неправильное решение : отличие в позиции (%d %d)", j, i);

	if (n <= 25)
		quitf(_ok , "N = %d : %d ходов", n, out.size());
    else {
    	if ((int)out.size() <= 3 * n * n)
			quitf(_ok , "N = %d : %d ходов", n, out.size());    		
		else {
			int tmp = getScore(out.size(), n);
			quitf(_points, "%d N = %d : %d ходов", tmp, n, out.size());    		
		}          
    }
}
