#include <iostream>
#include <algorithm>

using namespace std;

const int INF = 1e9;

// ĐỂ MẢNG Ở ĐÂY: Khai báo mảng tĩnh toàn cục tối đa 1005 x 1005 để không bị tràn bộ nhớ
int n, m;
int a[1005][1005];
int F[1005][1005]; // F[i][j] lưu chi phí nhỏ nhất từ ô (i, j) ra biên

int main() {
    // Tối ưu tốc độ nhập xuất cho mảng lớn
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int startX, startY;
    if (!(cin >> n >> m >> startX >> startY)) return 0;

    // Nhập ma trận
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
            F[i][j] = INF; // Ban đầu coi như mọi ô đều chưa có đường ra biên
        }
    }

    // Bước 1: Những ô nằm ở biên thì chi phí ra biên bằng chính nó
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (i == 0 || i == n - 1 || j == 0 || j == m - 1) {
                F[i][j] = a[i][j];
            }
        }
    }

    // Bước 2: Vòng lặp cập nhật loang bảng số (Co bóp ma trận)
    // Với N, M <= 1000, lặp tối đa khoảng 10-20 lần là ma trận ổn định và tối ưu xong
    for (int lan = 0; lan < 20; lan++) { 
        for (int i = 1; i < n - 1; i++) {
            for (int j = 1; j < m - 1; j++) {
                // Lấy ô có chi phí nhỏ nhất trong 4 hướng xung quanh
                int minXungQuanh = min({F[i-1][j], F[i+1][j], F[i][j-1], F[i][j+1]});
                
                // Nếu tìm được đường đi qua hàng xóm tốt hơn đường cũ, cập nhật lại
                if (minXungQuanh != INF && a[i][j] + minXungQuanh < F[i][j]) {
                    F[i][j] = a[i][j] + minXungQuanh;
                }
            }
        }
    }

    // Bước 3: In ra chi phí tại ô xuất phát
    cout << F[startX][startY] << "\n";

    return 0;
}
