#include #include #include #include #include #define REP(i, cnt) for (int i = 0; i < (cnt); i++) using namespace std; int main() { int Kx,Ky,Kr,px,py; int F[100][100][10][4]; char M[100][100],eol,p; int Mh,Mw,Mp,Marks; int Sx[10000],Sy[10000],Slen,Si; char P[10]; int Plen,Pi; int I[10000],aktI; while(scanf("%d%d\n",&Mh,&Mw)==2) { /*nacteni zadani*/ Mp=0; REP(j,Mh) { REP(i,Mw) { scanf("%c",&p); M[i][j]=p; if(p!='X') Mp++; } scanf("%c",&eol); } scanf("%d",&Plen); REP(i,Plen) scanf("%c",P+i); //calloc F, I memset(F, 0, sizeof(F)); memset(I, 0, sizeof(I)); aktI=0; Marks=0; /*starty*/ REP(My,Mw) REP(Mx,Mh) { if(M[Mx][My]=='X') continue; REP(R,4) { aktI++; Slen=Pi=0; Kx=Mx; Ky=My; Kr=R; while(1) { /*simulace*/ if(Pi==0) { Sx[Slen]=Kx; Sy[Slen]=Ky; Slen++; } if(F[Kx][Ky][Pi][Kr]) //nenula { if(I[F[Kx][Ky][Pi][Kr]]) //uspech //sour REP(Si,Slen) { if(M[Sx[Si]][Sy[Si]]!='M') { M[Sx[Si]][Sy[Si]]='M'; Marks++; if(Marks==Mp) { printf("OK\n"); goto answ; } } } } else F[Kx][Ky][Pi][Kr]=aktI; if(M[Kx][Ky]=='E') { I[aktI]=1; //sour REP(Si,Slen) { if(M[Sx[Si]][Sy[Si]]!='M') { M[Sx[Si]][Sy[Si]]='M'; Marks++; if(Marks==Mp) { printf("OK\n"); goto answ; } } } } switch(P[Pi++]) { case 'L': Kr=(Kr+1)%4; break; case 'R': Kr=(Kr-1)%4; if(Kr<0) Kr=3; break; default: //S px=Kx; py=Ky; switch(Kr) { case 0: if(py0) px--; break; case 2: if(py>0) py--; break; case 3: if(px