#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int Min(int a, int b) {
if(a < 0) {
return b;
}
if(b < 0) {
return a;
}
return min(a,b);
}
struct Pt {
int y;
int x;
};
int main() {
int n, m, y, x;
cin >> n >> m >> y >> x;
x--;
y--;
vector<string> map(n);
for(auto& v : map) {
cin >> v;
}
vector<pair<int,int>> round = {
{0,1},{0,-1},{1,0},{-1,0}
};
// 双人步数
vector<vector<int>> step(n, vector<int>(m,-1));
// 单人步数
vector<vector<int>> step2(n, vector<int>(m,-1));
deque<pair<Pt,Pt>> dq;
deque<Pt> dq2;
dq.emplace_back(Pt{y,x},Pt{y,x});
step[y][x] = 0;
while(dq.size()) {
auto pt = dq.front();
dq.pop_front();
auto cStep = step[pt.first.y][pt.first.x];
for(auto& off : round) {
auto my = pt.first.y + off.first;
auto mx = pt.first.x + off.second;
auto ny = pt.second.y - off.first;
auto nx = pt.second.x - off.second;
if( mx < 0 || mx >= m || my < 0 || my >= n) {
continue;
}
if( nx < 0 || nx >= m || ny < 0 || ny >= n) {
continue;
}
if(map[my][mx] == '#' || map[ny][nx] == '#') {
continue;
}
if(step[my][mx] != -1) {
continue;
}
auto ok = false;
if(map[my][mx] == '@') {
step2[ny][nx] = Min(cStep + 1, step2[ny][nx]);
dq2.emplace_back(Pt{ny,nx});
ok = true;
}
if(map[ny][nx] == '@') {
step2[my][mx] = Min(cStep + 1, step2[my][mx]);
dq2.emplace_back(Pt{my,mx});
ok = true;
}
// 可到达点不计入
if(ok) {
continue;
}
step[my][mx] = cStep + 1;
dq.emplace_back(Pt{my,mx},Pt{ny,nx});
}
}
// 没有找到传送点则无法逃脱
if(dq2.size() == 0) {
cout << -1 << endl;
return 0;
}
// 记录当前最小步数
int curStep = -1;
while(dq2.size()) {
auto pt = dq2.front();
dq2.pop_front();
auto ptStep = step2[pt.y][pt.x];
if( curStep == -1) {
curStep = ptStep;
} else {
// 当前步数过大则移动到最后 保证最小步数优先计算
if(ptStep > curStep + 1) {
dq2.emplace_back(pt);
continue;
} else {
curStep = ptStep;
}
}
if(map[pt.y][pt.x] == '@') {
// 第一个达成的就是最优解
cout << curStep << endl;
return 0;
}
for(auto& off : round) {
auto my = pt.y + off.first;
auto mx = pt.x + off.second;
if( mx < 0 || mx >= m || my < 0 || my >= n) {
continue;
}
if(map[my][mx] == '#') {
continue;
}
if(step2[my][mx] > 0 && step2[my][mx] <= ptStep + 1) {
continue;
}
step2[my][mx] = ptStep + 1;
dq2.emplace_back(Pt{my,mx});
}
}
}
// 64 位输出请用 printf("%lld")