import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
classPosition{
int x;
int y;
Position(int x, int y) {
this.x = x;
this.y = y;
}
}
publicclassMain{
staticint map[][];
staticboolean clean[][];
staticint N;
staticint M;
staticint r;
staticint c;
staticint d;
staticint count;
publicstaticvoidmain(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine(), " ");
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
map = newint [N][M];
clean = newboolean[N][M];
count = 0;
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j=0; j<M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
solve(r,c,d);
System.out.println(count);
}
publicstaticvoidsolve(int a, int b,int direction){
// 1) 현재칸이 청소되지 않았다면 현재 칸 청소.// 벽이 아닌 곳 if(!clean[a][b] && map[a][b]==0) {
clean[a][b] = true;
count++;
}
// 2) 현재 칸 주변 4칸 중 청소되지 않은 곳이 있는지 여부 int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
boolean flag = true;
for(int i=0; i<4; i++) {
int nx = a + dx[i];
int ny = b + dy[i];
// 청소 안 되어 있는지 확인 // flag= false : 한 곳이라도 청소 안 된 곳이 있음 if(!clean[nx][ny] && map[nx][ny]==0 ) {
flag = false;
}
}
// 2-1) 청소가 모두됨if(flag) {
int nextA =0;
int nextB =0;
// 후진
Position p = goBackward(a, b, direction);
nextA = p.x;
nextB = p.y;
// 후진 가능할 때,if(nextA>=0 && nextA<N && nextB>=0 && nextB<M && map[nextA][nextB]==0) {
// 후진 후 1번으로 돌아감.
solve(nextA,nextB,direction);
//후진 불가능
}else {
// 청소기 작동 멈춤. return;
}
// 2-2) 청소 안 된 빈 칸 있음.
}else {
// 반시계방향으로 90도 회전
direction = rotate(direction);
int nextA = 0;
int nextB = 0;
// 한 칸 앞 위치
Position p =moveForward(a,b,direction);
nextA = p.x;
nextB = p.y;
// 한 칸 앞이 청소되지 않은 빈 칸인 경우 한 칸 전진if(nextA >=0 && nextA <N && nextB >=0 && nextB <M &&!clean[nextA][nextB] && map[nextA][nextB]==0) {
// 1번으로 돌아감.
solve(nextA, nextB, direction);
// 한 칸 앞이 청소되지 않은 빈 칸이 아닌 경우
}else {
// 한 칸 전진 안 하고 1번으로 돌아감.
solve(a,b,direction);
}
}
}
// 후진publicstatic Position goBackward(int a, int b, int direction){
int x =0;
int y= 0;
//북쪽을 바라본다면 -> 남쪽 방향으로 이동if(direction == 0) {
x = a+1;
y = b;
//동쪽 -> 서쪽
}elseif(direction ==1) {
x = a;
y = b-1;
//남쪽 -> 북쪽
}elseif(direction ==2) {
x = a-1;
y = b;
//서쪽 -> 동쪽
}elseif(direction ==3) {
x = a;
y = b+1;
}
Position p = new Position(x,y);
return p;
}
// 한 칸 앞 전진publicstatic Position moveForward(int a, int b, int direction){
int x=0;
int y=0;
//북쪽을 바라볼 때 한 칸 전진if(direction ==0) {
x = a-1;
y = b;
// 동쪽
}elseif(direction ==1) {
x = a;
y = b+1;
// 남쪽
}elseif(direction ==2) {
x = a+1;
y = b;
//서쪽
}elseif(direction ==3) {
x = a;
y = b-1;
}
Position p = new Position(x,y);
return p;
}
// 반 시계 방향으로 90도 회전publicstaticintrotate(int direction){
//북쪽 ->서쪽 if(direction == 0) {
direction = 3;
// 동쪽 -> 북쪽
}elseif (direction == 1) {
direction = 0;
// 남쪽 -> 동쪽
}elseif(direction == 2) {
direction = 1;
// 서쪽 -> 남쪽
}elseif(direction ==3) {
direction = 2;
}
return direction;
}
}