#include #include #include #include #include #include #include #include #include #include static const int MOD = 1000000007; using ll = long long; using u32 = uint32_t; using namespace std; template constexpr T INF = ::numeric_limits::max()/32*15+208; template struct edge { int from, to; T cost; edge(int to, T cost) : from(-1), to(to), cost(cost) {} edge(int from, int to, T cost) : from(from), to(to), cost(cost) {} }; template vector dijkstra(int s,vector>> &G){ auto n = G.size(); vector d(n, INF); priority_queue,vector>,greater<>> Q; d[s] = 0; Q.emplace(0, s); while(!Q.empty()){ T cost; int i; tie(cost, i) = Q.top(); Q.pop(); if(d[i] < cost) continue; for (auto &&e : G[i]) { auto cost2 = cost + e.cost; if(d[e.to] <= cost2) continue; d[e.to] = cost2; Q.emplace(d[e.to], e.to); } } return d; } int main() { int n, v, ox, oy; cin >> n >> v >> ox >> oy; ox--; oy--; vector> c(n+2, vector(n+2, INF)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { scanf("%d", &c[i+1][j+1]); } } vector>> G(n*n); array dy{1, -1, 0, 0}, dx{0, 0, -1, 1}; auto f = [&](int i, int j){ return i*n+j; }; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { for (int k = 0; k < 4; ++k) { if(f(i+dy[k], j+dx[k]) >= 0 && f(i+dy[k], j+dx[k]) < n*n){ G[f(i, j)].emplace_back(f(i+dy[k], j+dx[k]), c[i+dy[k]+1][j+dx[k]+1]); } } } } auto dist = dijkstra(0, G); if(dist.back() < v){ puts("YES"); return 0; } if(ox == -1){ puts("NO"); return 0; } auto dist2 = dijkstra(f(oy, ox), G); if(v-dist[f(oy, ox)] > 0 && dist2.back() < (v-dist[f(oy, ox)])*2){ puts("YES"); }else puts("NO"); return 0; }