Problem:


Score : 400 points

Problem Statement

A maze is composed of a grid of H \times W squares - H vertical, W horizontal.

The square at the i-th row from the top and the j-th column from the left - (i,j) - is a wall if S_{ij} is # and a road if S_{ij} is ..

There is a magician in (C_h,C_w). He can do the following two kinds of moves:

Move A: Walk to a road square that is vertically or horizontally adjacent to the square he is currently in.

Move B: Use magic to warp himself to a road square in the 5\times 5 area centered at the square he is currently in.

In either case, he cannot go out of the maze.

At least how many times does he need to use the magic to reach (D_h, D_w)?

Constraints

1 \leq H,W \leq 10^3

1 \leq C_h,D_h \leq H

1 \leq C_w,D_w \leq W

S_{ij} is # or ..

S_{C_h C_w} and S_{D_h D_w} are ..

(C_h,C_w) \neq (D_h,D_w)

Input

Input is given from Standard Input in the following format:

H W
C_h C_w
D_h D_w
S_{11}\ldots S_{1W}
\vdots
S_{H1}\ldots S_{HW}

Output

Print the minimum number of times the magician needs to use the magic. If he cannot reach (D_h,D_w), print -1 instead.

Sample Input 1

4 4
1 1
4 4
..#.
..#.
.#..
.#..

Sample Output 1

1

For example, by walking to (2,2) and then using the magic to travel to (4,4), just one use of magic is enough.

Note that he cannot walk diagonally.

Sample Input 2

4 4
1 4
4 1
.##.
####
####
.##.

Sample Output 2

-1

He cannot move from there.

Sample Input 3

4 4
2 2
3 3
....
....
....
....

Sample Output 3

0

No use of magic is needed.

Sample Input 4

4 5
1 2
2 5
#.###
####.
#..##
#..##

Sample Output 4

2



Sample input:
4 4
1 1
4 4
..#.
..#.
.#..
.#..


Sample output:
1

Submission status: Time Limit Exceeded

Solution code:
import sys
import math
import heapq

(h, w) = [int(x) for x in sys.stdin.readline().strip().split(" ")]
(c_h, c_w) = [int(x) for x in sys.stdin.readline().strip().split(" ")]
(d_h, d_w) = [int(x) for x in sys.stdin.readline().strip().split(" ")]

maze = []
for line in sys.stdin:
    maze.append(list(line.strip())) 

def isReachable(i, j):
    if i < 1 or i > h or j < 1 or j > w:
        return False

    c = maze[i-1][j - 1]
    if c == '#':
        return False
    else:
        return True

def distance(fp, tp):
    if not isReachable(tp[1], tp[2]):
        return None

    h_diff = math.fabs(tp[1] - fp[1])
    w_diff = math.fabs(tp[2] - fp[2])

    if h_diff + w_diff < 2:
        return 0

    if h_diff < 3 or w_diff < 3:
        return 1

def adjacents(current):
    adjs = []
    for i in range(-2, 3):
        for j in range(-2, 3):
            if i == 0 and j == 0:
                continue
            dst = (None, current[1] + i, current[2] + j)
            dist = distance(current, dst)
            if dist is not None:
                dst = (dist, dst[1], dst[2])
                adjs.append(dst)

    return adjs

def dijkstra(results, start):
    """Calcualte the distance from start points to all the node
    """
    cur_dist = 0
    results[start[1] - 1][start[2] -1] = cur_dist
    heap = [ (p[0] + cur_dist, p[1], p[2]) for p in  adjacents(start) ]
    heapq.heapify(heap)

    while len(heap) > 0:
        visited = heapq.heappop(heap)
        if results[visited[1] - 1][visited[2] -1] is not None:
            continue

        results[visited[1] - 1][visited[2] -1] = visited[0]
        cur_dist = visited[0]

        adjs = list(filter(lambda x: results[x[1] - 1][x[2] - 1] is None, adjacents(visited)))

        for a in [(p[0] + cur_dist, p[1], p[2]) for p in adjs]:
            heapq.heappush(heap, a)


results = [[None] * w for i in range(0, h)]
start = (0, c_h, c_w)

dijkstra(results, start)

if results[d_h - 1][d_w -1] is None:
    print(-1)
else:
    print(results[d_h - 1][d_w -1])

Submission status: Time Limit Exceeded

Solution code:
# compiled by pythran
"""
#pythran export main2()
import numpy as np
i4 = np.int32
i8 = np.int64

L1 = 1000000001
L = 1000000000


def push(h, w, dis, s, stack_h, stack_w, p):
    if s[h, w] > dis:
        s[h, w] = dis
        stack_h[p] = h
        stack_w[p] = w
        p += 1
    return p


def solve(s, ih, iw):
    sh1 = np.empty(1000000, i8)
    sw1 = np.empty(1000000, i8)
    p1 = 0
    sh2 = np.empty(1000000, i8)
    sw2 = np.empty(1000000, i8)
    p2 = 0

    sh1[p1] = ih
    sw1[p1] = iw
    dis = 0
    p1 = push(ih, iw, dis, s, sh1, sw1, p1)

    while True:
        while p1 > 0:
            p1 -= 1
            h = sh1[p1]
            w = sw1[p1]
            p1 = push(h, w + 1, dis, s, sh1, sw1, p1)
            p1 = push(h, w - 1, dis, s, sh1, sw1, p1)
            p1 = push(h + 1, w, dis, s, sh1, sw1, p1)
            p1 = push(h - 1, w, dis, s, sh1, sw1, p1)
            for i in range(-2, 3):
                for j in range(-2, 3):
                    p2 = push(h + i, w + j, dis + 1, s, sh2, sw2, p2)

        dis += 1
        for i in range(p2):
            if s[sh2[i], sw2[i]] == dis:
                sh1[p1] = sh2[i]
                sw1[p1] = sw2[i]
                p1 += 1

        if p1 == 0:
            break


def main(in_file):
    stdin = open(in_file)
    H, W = [int(x) for x in stdin.readline().split()]
    ch, cw = [int(x) for x in stdin.readline().split()]
    dh, dw = [int(x) for x in stdin.readline().split()]
    s = np.empty((H + 4, W + 4), i8)
    for i in range(H + 4):
        for j in range(W + 4):
            s[i, j] = -1
    t = stdin.read()
    m = 0
    for i in range(2, H + 2):
        for j in range(2, W + 3):
            if ord(t[m]) == 46:
                s[i, j] = L1
            m += 1
    solve(s, ch + 1, cw + 1)
    if s[dh + 1, dw + 1] > L:
        print(-1)
    else:
        print(s[dh + 1, dw + 1])


def main2():
    main('/dev/stdin')
"""
import os, sys
p = os.path.dirname(__file__)
pymain = os.path.join(p, "a.out")
if len(sys.argv) == 1:
    import subprocess
    if p == "":
        pymain = "./" + pymain
    subprocess.call(pymain)
else:
    import gzip, base64, stat
    gz = b'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'
    bin = gzip.decompress(base64.b64decode(gz))
    with open(pymain, "wb") as f:
        f.write(bin)
    os.chmod(pymain, 0o775)