#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; 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; // 次のマスへ移動すると、移動した先の砂漠レベル分の体力が減る。-> スタート地点は減算しない!! priority_queue 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]