#include #include #include #include #include #include #include using namespace std; #define INF (int)1e7 vectorL; int N, V, Ox, Oy,O; int status[40000]; int cost[40000]; void dijkstra(int s) { int dir[] = { -1 * N,1,1 * N,-1 }; for (int i = 0; i < N*N; i++) { status[i] = 0; cost[i] = INF; } cost[s] = 0; status[s] = 1; priority_queue,vector>,greater>>U; U.push(make_pair(cost[s],s)); while (!U.empty()) { //探索が終わってない中でコスト最小の点 int u = U.top().second; U.pop(); if (status[u] == -1) continue; status[u] = -1; //コスト最少の点を探る for (int i = 0; i < 4; i++) { if (status[u + dir[i]] != -1 && u + dir[i] >= 0 && u + dir[i] < N*N) { if ((dir[i] == 1 || dir[i] == -1) && (u + dir[i]) / N != u / N)continue; if (cost[u + dir[i]] > cost[u] + L[u + dir[i]] && V > cost[u] + L[u + dir[i]]) { cost[u + dir[i]] = cost[u] + L[u + dir[i]]; status[u + dir[i]] = 1; U.push(make_pair(cost[u + dir[i]], u + dir[i])); } } } } } int main() { cin >> N >> V >> Ox >> Oy; Ox--; Oy--; O = Oy * N + Ox; bool hasOasis = O >= 0; L.resize(N*N); for (int i = 0; i < N*N; i++) { cin >> L[i]; } dijkstra(0); if (cost[N*N - 1] < V) { cout << "YES" << endl; return 0; } else if(cost[O]