from math import inf
from collections import deque
import sys

n,m = map(int,input().split())    #网格大小
xs,ys,xt,yt = map(int,input().split())
xs,ys,xt,yt =xs-1,ys-1,xt-1,yt-1
# arr[0]----->起点x坐标 arr[1]----->起点y坐标  arr[2]----->终点x坐标  arr[3]----->终点y坐标

d = []    # 迷宫
map_list = [[inf for _ in range(m)] for _ in range(n)]  #邻接矩阵
open_list = deque([])  #未搜索列表
visited = set()  # 已搜索表

for i in range(n):
    d.append(input())

map_list[xs][ys] = 0
open_list.append([xs,ys])
def search_four(n,m,a,map_list,d,xt,yt):
    cost = map_list[a[0]][a[1]]
    visited.add((a[0],a[1]))
    for [u,v] in [[0,1],[0,-1],[1,0],[-1,0]]:
        x = a[0]+u
        y = a[1]+v
        if x==xt and y==yt:
            map_list[x][y] = 1+cost
        elif 0 <= x <n and 0 <= y < m and d[x][y]!='*' and (x,y) not in visited:
                map_list[x][y] = 1+cost
                open_list.append([x,y])    
                visited.add((x,y))
    return map_list


# 从起点开始搜索,搜索上下左右四个方向,如果有点的话,就将cost+1记录下来,并且标记起点为已经搜索过(已完成)
# 将未搜索过的点按照cost的大小排列,取出cost最小的点(弹出最左边代替排序)
# 从这个cost最小的点开始搜索,搜索上下左右四个方向,如果存在这个点并且这个点没有被搜索过,那就将cost+1作为它的代价记录下来,并且标记之前cost最小的点搜索过,如果上下左右的点有的点已经有cost了,比较大小取最小的那个值作为cost保存下来(已完成)
# 循环操作步骤2和3。直到已经搜索到终点,即终点的cost有值了,就结束;或者是已经没有点需要被搜索了,还没有找到终点,那么就是没有相关的路径(已完成)
count = map_list[xt][yt]
if d[xt][yt]=='*':
    print(-1)
else:
    while open_list and count==inf:
        a = open_list.popleft()
        search_four(n,m,a,map_list,d,xt,yt)
        count = map_list[xt][yt]

    if count ==inf:
        print(-1)
    else:
        print(count)

本来想用D算法,写着写着发现不用那么复杂,BFS算法就可以,注意点就是:字典的问题,还有减枝,在同一层的点不用遍历两次