# 读取格式:全部按整数读取,支持以空格分隔的行
# 功能:BFS + 续航状态,落在充电站就把 rem 置为 k
import sys, re
from collections import deque
def shortest_path(m, n, grid, sr, sc, tr, tc, k):
best = [[-1]*n for _ in range(m)]
q = deque()
best[sr][sc] = k
q.append((sr, sc, k, 0)) # r,c,rem,dist
dirs = [(1,0),(-1,0),(0,1),(0,-1)]
while q:
r, c, rem, dist = q.popleft()
if r == tr and c == tc:
return dist
if rem == 0 and grid[r][c] != 2: # 没电且不在充电站,无法继续
continue
for dr, dc in dirs:
nr, nc = r+dr, c+dc
if 0 <= nr < m and 0 <= nc < n and grid[nr][nc] != 1:
new_rem = k if grid[nr][nc] == 2 else rem - 1
if new_rem > best[nr][nc]:
best[nr][nc] = new_rem
q.append((nr, nc, new_rem, dist+1))
return -1
def main():
data = list(map(int, re.findall(r'-?\d+', sys.stdin.read())))
it = iter(data)
m = next(it); n = next(it)
grid = [[next(it) for _ in range(n)] for _ in range(m)]
sr, sc = next(it), next(it)
tr, tc = next(it), next(it)
k = next(it)
print(shortest_path(m, n, grid, sr, sc, tr, tc, k))
if __name__ == "__main__":
main()
// 说明:直接用 >> 读取整数(忽略空白),逐个读 m*n 个网格数,完全适配“0 0 0”格式。
// BFS + 剩余步数剪枝;ACM 风格。
#include <bits/stdc++.h>
using namespace std;
int bfs(const vector<vector<int>>& g, int sr, int sc, int tr, int tc, int k) {
int m = g.size(), n = g[0].size();
vector<vector<int>> best(m, vector<int>(n, -1));
queue<array<int,4>> q; // r,c,rem,dist
best[sr][sc] = k;
q.push({sr, sc, k, 0});
const int dr[4] = {1,-1,0,0};
const int dc[4] = {0,0,1,-1};
while (!q.empty()) {
auto cur = q.front(); q.pop();
int r = cur[0], c = cur[1], rem = cur[2], dist = cur[3];
if (r == tr && c == tc) return dist;
if (rem == 0 && g[r][c] != 2) continue;
for (int d = 0; d < 4; ++d) {
int nr = r + dr[d], nc = c + dc[d];
if (nr < 0 || nr >= m || nc < 0 || nc >= n) continue;
if (g[nr][nc] == 1) continue; // 障碍不可过
int newRem = (g[nr][nc] == 2) ? k : rem - 1;
if (newRem > best[nr][nc]) {
best[nr][nc] = newRem;
q.push({nr, nc, newRem, dist + 1});
}
}
}
return -1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int m, n;
if (!(cin >> m >> n)) return 0;
vector<vector<int>> grid(m, vector<int>(n));
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
cin >> grid[i][j];
int sr, sc, tr, tc, k;
cin >> sr >> sc >> tr >> tc >> k;
cout << bfs(grid, sr, sc, tr, tc, k) << '\n';
return 0;
}
// 说明:使用自写的快速整数读取(兼容空格/换行/其它字符),适配“0 0 0”这种行。
// BFS + 剩余步数剪枝;类名 Main,ACM 风格。
import java.io.*;
import java.util.*;
public class Main {
// 简洁快读:读取下一个整数,跳过所有非数字字符
static class FastReader {
private final InputStream in;
private final byte[] buffer = new byte[1 << 16];
private int ptr = 0, len = 0;
FastReader(InputStream is){ in = is; }
private int read() throws IOException {
if (ptr >= len) {
len = in.read(buffer);
ptr = 0;
if (len <= 0) return -1;
}
return buffer[ptr++];
}
int nextInt() throws IOException {
int c, sign = 1, x = 0;
do { c = read(); } while (c != -1 && c <= ' '); // 跳过空白
if (c == '-') { sign = -1; c = read(); }
for (; c > ' '; c = read()) x = x * 10 + (c - '0');
return x * sign;
}
}
static int bfs(int[][] g, int sr, int sc, int tr, int tc, int k) {
int m = g.length, n = g[0].length;
int[][] best = new int[m][n];
for (int i = 0; i < m; i++) Arrays.fill(best[i], -1);
ArrayDeque<int[]> q = new ArrayDeque<>();
best[sr][sc] = k;
q.add(new int[]{sr, sc, k, 0}); // r,c,rem,dist
int[] dr = {1,-1,0,0};
int[] dc = {0,0,1,-1};
while (!q.isEmpty()) {
int[] cur = q.poll();
int r = cur[0], c = cur[1], rem = cur[2], dist = cur[3];
if (r == tr && c == tc) return dist;
if (rem == 0 && g[r][c] != 2) continue;
for (int d = 0; d < 4; d++) {
int nr = r + dr[d], nc = c + dc[d];
if (nr < 0 || nr >= m || nc < 0 || nc >= n) continue;
if (g[nr][nc] == 1) continue; // 障碍
int newRem = (g[nr][nc] == 2) ? k : rem - 1;
if (newRem > best[nr][nc]) {
best[nr][nc] = newRem;
q.add(new int[]{nr, nc, newRem, dist + 1});
}
}
}
return -1;
}
public static void main(String[] args) throws Exception {
FastReader fr = new FastReader(System.in);
int m = fr.nextInt(), n = fr.nextInt();
int[][] grid = new int[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
grid[i][j] = fr.nextInt(); // 逐个整数读取,适配“0 0 0”格式
int sr = fr.nextInt(), sc = fr.nextInt();
int tr = fr.nextInt(), tc = fr.nextInt();
int k = fr.nextInt();
System.out.println(bfs(grid, sr, sc, tr, tc, k));
}
}