#include #include using namespace std; using namespace atcoder; #define rep(i, n) REP(i, 0, n) #define REP(i, s, e) for (ll i = (s); i < (ll)(e); i++) #define repr(i, n) REPR(i, n, 0) #define REPR(i, s, e) for (ll i = (ll)(s - 1); i >= (ll)(e); i--) #define all(r) r.begin(), r.end() #define rall(r) r.rbegin(), r.rend() typedef long long ll; typedef vector vi; typedef vector vl; template bool chmax(T& a, const U& b) { if (a >= b) return false; a = b; return true; } template bool chmin(T& a, const U& b) { if (a <= b) return false; a = b; return true; } void yes_no(bool f, string yes = "Yes", string no = "No") { cout << (f ? yes : no) << "\n"; } void solve() { int n, v, sx, sy, gx, gy; cin >> n >> v >> sx >> sy >> gx >> gy; sx--; sy--; gx--; gy--; vector s(n, vl(n)); rep(i, n) rep(j, n) cin >> s[i][j]; const int inf = 1e9; vector d(n, vector(n, vi(v + 1, inf))); d[sy][sx][v] = 0; using T = tuple; queue q; q.emplace(sy, sx, v); int dx[] = {0, -1, 0, 1}; int dy[] = {-1, 0, 1, 0}; auto isOutOfRange = [](int h, int w, int H, int W) { return h < 0 || h >= H || w < 0 || w >= W; }; while (!q.empty()) { auto [y, x, hp] = q.front(); q.pop(); rep(i, 4) { int nx = x + dx[i], ny = y + dy[i]; if (isOutOfRange(ny, nx, n, n) || s[ny][nx] >= hp) continue; int nhp = hp - s[ny][nx]; if (chmin(d[ny][nx][nhp], d[y][x][hp] + 1)) { q.emplace(ny, nx, nhp); } } } int ans = *min_element(all(d[gy][gx])); if (ans == inf) ans = -1; cout << ans << "\n"; } int main() { cin.tie(0); ios::sync_with_stdio(false); int t = 1; // cin >> t; rep(ti, t) solve(); return 0; }