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: Accepted

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

INF = 1000000000


def q_push(h1, w1, p, sh, sw):
    sh[p] = h1
    sw[p] = w1
    p += 1
    return p


def solve(a, ch, cw):
    sh1 = np.empty(1000000, i8)
    sw1 = np.empty(1000000, i8)
    p1 = 0
    sh2 = np.empty(1000000, i8)
    sw2 = np.empty(1000000, i8)
    p2 = 0

    dis = 0
    a[ch, cw] = dis
    sh1[p1] = ch
    sw1[p1] = cw
    p1 += 1

    while True:
        while p1 > 0:
            p1 -= 1
            h = sh1[p1]
            w = sw1[p1]
            for i in range(-2, 3):
                for j in range(-2, 3):
                    if ((i == 1 or i == -1) and j == 0) or (i == 0 and (j == 1 or j == -1)):
                        if a[h + i, w + j] > dis:
                            a[h + i, w + j] = dis
                            p1 = q_push(h + i, w + j, p1, sh1, sw1)
                    else:
                        if a[h + i, w + j] > dis + 1:
                            a[h + i, w + j] = dis + 1
                            p2 = q_push(h + i, w + j, p2, sh2, sw2)

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

        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()]
    a = np.empty((H + 4, W + 4), i8)
    for i in range(H + 4):
        for j in range(W + 4):
            a[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:
                a[i, j] = INF
            m += 1
    solve(a, ch + 1, cw + 1)
    ans = a[dh + 1, dw + 1]
    if ans == INF:
        print(-1)
    else:
        print(ans)


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)

Submission status: Accepted

Solution code:
from collections import deque

H, W = map(lambda x: int(x)+4, input().split())
Ch, Cw = map(int, input().split())
Dh, Dw = map(int, input().split())

grid = '#' * W * 2
for _ in range(H-4):
  grid += '##' + input() + '##'
grid += '#' * W * 2

magic_list = []
for i in range(5):
  for j in range(5):
    if (i, j) in [(2, 2), (1, 2), (2, 1), (2, 3), (3, 2)]:
      continue
    else:
      magic_list.append(i-2 + W*(j-2))

move_list = [-1, 1, W, -W]

def bfs(start):
  INF = 10 ** 9
  dist = [INF] * (H*W)
  dist[start] = 0
  qw = deque([start])
  qm = deque([])
  while qw or qm:
    while qw:
      v = qw.popleft()
      dv = dist[v]
      magic_flag = True
      for move in move_list:
        w = v + move
        if grid[w] == '#':
          if magic_flag:
            qm.append(v)
            magic_flag = False
          continue
        dw = dv
        if dw >= dist[w]:
          continue
        dist[w] = dw
        qw.append(w)
    while qm:
      v = qm.popleft()
      dv = dist[v]
      for magic in magic_list:
        w = v + magic
        if grid[w] == '#':
          continue
        dw = dv + 1
        if dw >= dist[w]:
          continue
        dist[w] = dw
        qw.append(w)
  return dist

ans = bfs( (Ch+1)*W + Cw+1 )[(Dh+1)*W + Dw+1]

if ans == 10**9:
  print(-1)
else:
  print(ans)

Submission status: Accepted

Solution code:
H, W = [int(x) for x in input().split()]
c_h, c_w = [int(x) - 1 for x in input().split()]  # Convert to 0-origin
d_h, d_w = [int(x) - 1 for x in input().split()]  # Convert to 0-origin
s = [['.' for w in range(W)] for h in range(H)]
for h in range(H):
    s[h] = input()

def in_the_map(x):
    if x[0] < 0 or H <= x[0] or x[1] < 0 or W <= x[1]:
        return False
    return True
 
costs = [[-1 for w in range(W)] for h in range(H)]
 
def dfs(h, w, c, q):
    if not in_the_map((h, w)):
        return
    if costs[h][w] >= 0:
        return
    if s[h][w] != '.':
        return
    q.append((h, w))
    costs[h][w] = c 
    dfs(h - 1, w, c, q)
    dfs(h + 1, w, c, q)
    dfs(h, w - 1, c, q)
    dfs(h, w + 1, c, q)

queue = [(c_h, c_w)]
cost = 0
while len(queue) > 0:
    visited = []
    for q in queue:
        dfs(q[0], q[1], cost, visited)
    
    next_queue = []
    for v in visited:
        for dh in range(-2, 3):
            for dw in range(-2, 3):
                hh = v[0] + dh 
                ww = v[1] + dw
                if not in_the_map((hh, ww)):
                    continue
                if costs[hh][ww] >= 0:
                    continue
                if s[hh][ww] != '.':
                    continue
                next_queue.append((hh, ww))

    cost += 1
    queue = next_queue

print(costs[d_h][d_w])