#include #include #include #include int main() { using namespace std; int n, life, ox, oy; cin >> n >> life >> ox >> oy; vector L(n, vector(n)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> L[j][i]; } } int m = n * n; constexpr int dx[] = {-1, 0, 1, 0}; constexpr int dy[] = {0, -1, 0, 1}; vector>> g(m); for (int x = 0; x < n; x++) { for (int y = 0; y < n; y++) { int p = x * n + y; for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || nx >= n || ny < 0 || ny >= n) { continue; } int np = nx * n + ny; g[p].emplace_back(np, L[nx][ny]); } } } constexpr int INF = 1e9; auto dijkstra = [&](int start, vector>> &g) -> vector { int n = g.size(); vector res(n, INF); res[start] = 0; priority_queue< pair, vector>, greater>> que; que.emplace(0, start); while (!que.empty()) { auto [c, v] = que.top(); que.pop(); if (res[v] < c) { continue; } for (auto [nv, w] : g[v]) { if (res[nv] > c + w) { res[nv] = c + w; que.emplace(c + w, nv); } } } return res; }; bool ok = false; auto d0 = dijkstra(0, g); if (d0[m - 1] < life) { ok = true; } if (ox > 0 && oy > 0) { int p = (ox - 1) * n + (oy - 1); int rem_life = (life - d0[p]) * 2; auto dp = dijkstra(p, g); if (dp[m - 1] < rem_life) { ok = true; } } cout << (ok ? "YES\n" : "NO\n"); }