{-# LANGUAGE BangPatterns        #-}
{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE MultiWayIf          #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}
import           Control.Monad
import           Control.Monad.ST
import           Control.Monad.State
import           Data.Array.IArray
import           Data.Array.ST
import           Data.Array.Unboxed
import qualified Data.ByteString.Char8 as BS
import           Data.Char
import           Data.List

main :: IO ()
main = do
  [h,w] <- readLnAsListWith unconsInt
  [cx,cy] <- readLnAsListWith unconsInt
  [dx,dy] <- readLnAsListWith unconsInt
  sgrid <- readLnAs2DArrayWith unconsChar h w :: IO (UArray (Int,Int) Char)

  let ggrid = gridDfs (h,w) (cx,cy) (\g (i,j) -> g ! (i,j) == '#') sgrid

  print $ ggrid ! (dx,dy)

  return ()


type Grid a = UArray (Int,Int) a
type MGrid s = STUArray s (Int,Int)

gridDfs :: (Int,Int) -> (Int,Int) -> (Grid a -> (Int,Int) -> Bool) -> Grid a -> UArray (Int,Int) Int
gridDfs (h',w') (sh,sw) f g = runSTUArray $ do
  seen <- newArray ((1,1),(h',w')) (-1) :: ST s (STUArray s (Int,Int) Int)
  go seen (sh,sw) 0
  return seen

  where go :: MGrid s Int -> (Int,Int) -> Int -> ST s ()
        go seen (h,w) color = do
          c <- readArray seen (h,w)
          if c /= (-1) && c <= color then return () else do
            writeArray seen (h,w) color
            let nexts1 = neighbour4 (h,w)
            forM_ nexts1 $ \(nh,nw) -> do
              c' <- readArray seen (nh,nw)
              if g `f` (nh,nw) || c' /= (-1)
                then do return ()
                else do go seen (nh,nw) color

            let nexts2 = neighbour25 (h,w)
            forM_ nexts2 $ \(nh,nw) ->
              if g `f` (nh,nw)
              then do return ()
              else do go seen (nh,nw) (color+1)

        neighbour4 :: (Int,Int) -> [(Int,Int)]
        neighbour4 (h,w) = filter inGrid [(h+x,w+y) | (x,y) <- [(-1,0),(1,0),(0,-1),(0,1)]]

        neighbour25 :: (Int,Int) -> [(Int,Int)]
        neighbour25 (h,w) = filter inGrid [(h+x,w+y) | x <- [-2..2], y <- [-2..2], (x,y) /= (0,0)]

        inGrid :: (Int,Int) -> Bool
        inGrid (h,w) = h >= 1 && h <= h' && w >= 1 && w <= w'



-- converter
unconsChar :: StateT BS.ByteString Maybe Char
unconsChar = StateT BS.uncons

unconsInt :: StateT BS.ByteString Maybe Int
unconsInt = StateT $ BS.readInt . BS.dropWhile isSpace

readLnAsListWith :: StateT BS.ByteString Maybe a -> IO [a]
readLnAsListWith !st = unfoldr (runStateT st) <$> BS.getLine

readLnAs2DArrayWith :: IArray a e => StateT BS.ByteString Maybe e -> Int -> Int -> IO (a (Int,Int) e)
readLnAs2DArrayWith !st !n !m = listArray ((1,1),(n,m)) . unfoldr (runStateT st) . BS.concat <$> replicateM n BS.getLine
