package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

const INF = 1e9

type Node struct {
	r, c int
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	parts := strings.Fields(scanner.Text())
	n, _ := strconv.Atoi(parts[0])
	m, _ := strconv.Atoi(parts[1])
	r_start, _ := strconv.Atoi(parts[2])
	c_start, _ := strconv.Atoi(parts[3])
	r_start--
	c_start-- // 0-indexed

	grid := make([]string, n)
	for i := 0; i < n; i++ {
		scanner.Scan()
		grid[i] = scanner.Text()
	}

	// Step 1: Multi-source BFS for solo phase
	dist_solo := make([][]int, n)
	for i := range dist_solo {
		dist_solo[i] = make([]int, m)
		for j := range dist_solo[i] {
			dist_solo[i][j] = -1
		}
	}

	q_solo := make([]Node, 0)
	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			if grid[i][j] == '@' {
				dist_solo[i][j] = 0
				q_solo = append(q_solo, Node{i, j})
			}
		}
	}

	dr := []int{-1, 1, 0, 0}
	dc := []int{0, 0, -1, 1}

	for len(q_solo) > 0 {
		current := q_solo[0]
		q_solo = q_solo[1:]
		r, c := current.r, current.c

		for i := 0; i < 4; i++ {
			nr := r + dr[i]
			nc := c + dc[i]
			if nr >= 0 && nr < n && nc >= 0 && nc < m && grid[nr][nc] != '#' && dist_solo[nr][nc] == -1 {
				dist_solo[nr][nc] = dist_solo[r][c] + 1
				q_solo = append(q_solo, Node{nr, nc})
			}
		}
	}

	// Step 2: BFS for paired phase
	dist_pair := make([][]int, n)
	for i := range dist_pair {
		dist_pair[i] = make([]int, m)
		for j := range dist_pair[i] {
			dist_pair[i][j] = -1
		}
	}

	q_pair := make([]Node, 0)
	dist_pair[r_start][c_start] = 0
	q_pair = append(q_pair, Node{r_start, c_start})

	for len(q_pair) > 0 {
		current := q_pair[0]
		q_pair = q_pair[1:]
		r1, c1 := current.r, current.c

		r2 := 2*r_start - r1
		c2 := 2*c_start - c1

		for i := 0; i < 4; i++ {
			nr1 := r1 + dr[i]
			nc1 := c1 + dc[i]
			nr2 := r2 - dr[i]
			nc2 := c2 - dc[i]

			if nr1 >= 0 && nr1 < n && nc1 >= 0 && nc1 < m && grid[nr1][nc1] != '#' &&
				nr2 >= 0 && nr2 < n && nc2 >= 0 && nc2 < m && grid[nr2][nc2] != '#' &&
				dist_pair[nr1][nc1] == -1 {
				dist_pair[nr1][nc1] = dist_pair[r1][c1] + 1
				q_pair = append(q_pair, Node{nr1, nc1})
			}
		}
	}

	// Step 3: Combine results
	min_total_time := int64(-1)

	for r1 := 0; r1 < n; r1++ {
		for c1 := 0; c1 < m; c1++ {
			if dist_pair[r1][c1] != -1 {
				t_pair := int64(dist_pair[r1][c1])
				r2 := 2*r_start - r1
				c2 := 2*c_start - c1

				if r2 >= 0 && r2 < n && c2 >= 0 && c2 < m {
					if grid[r1][c1] == '@' && dist_solo[r2][c2] != -1 {
						current_time := t_pair + int64(dist_solo[r2][c2])
						if min_total_time == -1 || current_time < min_total_time {
							min_total_time = current_time
						}
					}
					if grid[r2][c2] == '@' && dist_solo[r1][c1] != -1 {
						current_time := t_pair + int64(dist_solo[r1][c1])
						if min_total_time == -1 || current_time < min_total_time {
							min_total_time = current_time
						}
					}
				}
			}
		}
	}

	fmt.Println(min_total_time)
}