package main
import (
"bufio"
"fmt"
"os"
)
type Pair struct {
r, c int
}
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
var r1, c1, r2, c2 int
fmt.Fscan(in, &r1, &c1)
fmt.Fscan(in, &r2, &c2)
r1--
c1--
r2--
c2--
grid := make([]string, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &grid[i])
}
dirs := []Pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
visited1 := make([][]bool, n)
for i := range visited1 {
visited1[i] = make([]bool, n)
}
comp1 := []Pair{}
q := []Pair{{r1, c1}}
visited1[r1][c1] = true
for len(q) > 0 {
p := q[0]
q = q[1:]
comp1 = append(comp1, p)
for _, d := range dirs {
nr, nc := p.r+d.r, p.c+d.c
if nr >= 0 && nr < n && nc >= 0 && nc < n && !visited1[nr][nc] && grid[nr][nc] == '0' {
visited1[nr][nc] = true
q = append(q, Pair{nr, nc})
}
}
}
if visited1[r2][c2] {
fmt.Fprintln(out, 0)
return
}
visited2 := make([][]bool, n)
for i := range visited2 {
visited2[i] = make([]bool, n)
}
comp2 := []Pair{}
q = []Pair{{r2, c2}}
visited2[r2][c2] = true
for len(q) > 0 {
p := q[0]
q = q[1:]
comp2 = append(comp2, p)
for _, d := range dirs {
nr, nc := p.r+d.r, p.c+d.c
if nr >= 0 && nr < n && nc >= 0 && nc < n && !visited2[nr][nc] && grid[nr][nc] == '0' {
visited2[nr][nc] = true
q = append(q, Pair{nr, nc})
}
}
}
minCost := int(1<<31 - 1)
for _, a := range comp1 {
for _, b := range comp2 {
dr := a.r - b.r
dc := a.c - b.c
cost := dr*dr + dc*dc
if cost < minCost {
minCost = cost
}
}
}
fmt.Fprintln(out, minCost)
}