#include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i, N) for(int (i)=0; (i)<(N); (i)++) #define ll long long #define mp make_pair #define pb push_back bool ok[111][111]; char bd[111][111]; char prog[11]; int d[4][2] = {{-1,0},{0,1},{1,0},{0, -1}}; int visited[111][111][11][4]; int reached[111][111][11][4]; int h,w,l; bool run(int r, int c, int in, int dir) { if(visited[r][c][in][dir]) { return reached[r][c][in][dir]; } visited[r][c][in][dir] = true; bool res = bd[r][c] == 'E'; if(prog[in] == 'S') { int fr = r+d[dir][0], fc = c+d[dir][1]; if(fr >= h||fc>=w||fr<0||fc<0||bd[fr][fc]=='X') { fr = r; fc = c; } res |= run(fr, fc, (in+1)%l, dir); } else if(prog[in] == 'R') { res |= run(r, c, (in+1)%l, (dir+1)%4); } else if(prog[in] == 'L') { res |= run(r, c, (in+1)%l, (dir+3)%4); } return (reached[r][c][in][dir]=res); } int main() { while(scanf("%d %d", &h, &w) == 2) { REP(i, h) REP(j, w) ok[i][j] = false; REP(i, h) scanf("%s", bd[i]); scanf("%d", &l); scanf("%s", prog); memset(visited, 0, sizeof(visited)); int total=0, right = 0; REP(i, h) REP(j, w) { memset(visited, 0, sizeof(visited)); memset(reached, 0, sizeof(reached)); if(bd[i][j] == '.' || bd[i][j] == 'E') { total++; bool xxx = false; REP(k, l) { if(run(i, j, k, 0)) xxx = true; } if(xxx) { // printf("%d %d\n", i, j); right++; } } } if(total == right) printf("OK\n"); else printf("%d\n", right); } return 0; }