#include using namespace std; typedef unsigned int uint; typedef long long int ll; typedef unsigned long long int ull; #define debugv(v) printf("L%d %s => ",__LINE__,#v);for(auto e:v){cout< ",__LINE__,#m);for(int x=0;x<(w);x++){cout<<(m)[x]<<" ";}cout< ostream& operator <<(ostream &o,const pair p){o<<"("< void input_integer(T& var){ var = 0; T sign = 1; int cc = getchar_unlocked(); for (;cc<'0'||'9'>(int& var){ input_integer(var); return *this; } MaiScanner& operator>>(long long& var){ input_integer(var); return *this; } }; class MaiPrinter{ int stack_p; char stack[32]; public: template void output_integer(T var){ if (var == 0){ putchar_unlocked('0'); return; } if (var < 0){ putchar_unlocked('-'); var = -var; } stack_p=0; while (var){ stack[stack_p++]='0'+(var%10); var /= 10; } while(stack_p) putchar_unlocked(stack[--stack_p]); } MaiPrinter& operator<<(char c){ putchar_unlocked(c); return *this; } MaiPrinter& operator<<(int var){ output_integer(var); return *this; } MaiPrinter& operator<<(long long var){ output_integer(var); return *this; } }; } MaiScanner scanner; MaiPrinter printer; template class p_queue { T data[maxsize]; int size = 0; public: p_queue() {} // 一番大きい要素 const T& top() { return data[0]; } void pop() { int now = 0; int l = 1; int r = 2; swap(data[--size], data[0]); while (l < size) { if (data[now] < data[l]) { if (r < size && data[l] < data[r]) goto _l_pqpop_rswp; swap(data[now], data[l]); now = l; l = (now << 1) + 1; r = (now << 1) + 2; continue; } if (r < size && data[now] < data[r]) { _l_pqpop_rswp: swap(data[now], data[r]); now = r; l = (now << 1) + 1; r = (now << 1) + 2; continue; } break; } } void push(const T& val) { int p; int now = size++; data[now] = val; while (0 < now) { p = (now - 1) >> 1; if (data[now] > data[p]) { swap(data[now], data[p]); now = p; } else { break; } } } bool empty() { return size == 0; } }; int maze[250][250]; int dp[250][250][2]; int n; int main(){ int i,j,k,l,x,y; int hp,ox,oy; cin>>n>>hp>>ox>>oy; for (y=1;y<=n;++y) for (x=1;x<=n;++x){ scanner >> maze[x][y]; ++maze[x][y]; } // ------------------------------------------------------------------------------------------- hp+=maze[1][1]-1; // 次のマスへ移動すると、移動した先の砂漠レベル分の体力が減る。-> スタート地点は減算しない!! p_queue<50000,int> q; q.push((hp<<16)|(1<<8)|(1)); dp[1][1][0]=1; //int sushi=0; while (!q.empty()){ l=q.top();q.pop(); k= (l>>28); hp=(l>>16)&0xFFF; x =(l>> 8)&0xFF; y =(l )&0xFF; hp-=maze[x][y]-1; if (hp<=0) continue; if (x==n&&y==n){puts("YES");return 0;} if (ox==x && oy==y && !k){hp*=2;k=1;} if (dp[x-1][y][k]