using System; using System.Collections.Generic; using System.Linq; using System.Diagnostics; struct D { public int row, col, vitality, step; } class Program { static string ReadLine() { return Console.ReadLine().Trim(); } static int ReadInt() { return int.Parse(Console.ReadLine()); } static int[] ReadInts() { return ReadLine().Split().Select(int.Parse).ToArray(); } static string[] ReadStrings() { return ReadLine().Split(); } static int BFS(int n, int vitality, int srow, int scol, int grow, int gcol, int[,] g) { var memo = new int[n, n]; var q = new Queue(); q.Enqueue(new D { row=srow, col=scol, vitality=vitality, step=0 }); while (q.Count > 0) { var d = q.Dequeue(); if (d.row == grow && d.col == gcol) return d.step; if (memo[d.row, d.col] > 0 && memo[d.row, d.col] >= d.vitality) continue; memo[d.row, d.col] = d.vitality; var dxy = new[] { 0, 1, 0, -1 }; for (int i = 0; i < dxy.Length; i++) { int r = d.row + dxy[i]; int c = d.col + dxy[3-i]; if (0 <= r && r < n && 0 <= c && c < n) { int v2 = d.vitality - g[r, c]; if (v2 > 0) { q.Enqueue(new D { row=r, col=c, vitality=v2, step=d.step + 1 }); } } } } return -1; } static void Main() { var xs = ReadInts(); int n = xs[0]; int vitality = xs[1]; int sx = xs[2], sy = xs[3]; int gx = xs[4], gy = xs[5]; var g = new int[n, n]; for (int i = 0; i < n; i++) { var s = ReadInts(); for (int j = 0; j < n; j++) { g[i, j] = s[j]; } } Console.WriteLine(BFS(n, vitality, sy-1, sx-1, gy-1, gx-1, g)); } }