#include #define FOR(i,a,b) for (int i=(a);i<(b);i++) #define FORR(i,a,b) for (int i=(a);i>=(b);i--) #define pb push_back #define pcnt __builtin_popcount #define show(x) cout<<#x<<" = "< pii; typedef vector vi; typedef vector vvi; typedef vector vpii; typedef set si; typedef pair pll; typedef vector vl; typedef vector vvl; typedef vector vpll; typedef set sl; templatestring join(vector&v) {stringstream s;FOR(i,0,sz(v))s<<' '<b)swap(a,b);for(;a>0;b%=a,swap(a,b));return b;} int modpow(ll a,ll n,int m){if(a==0)return a;ll p=1;for(;n>0;n/=2,a=a*a%m)if(n&1)p=p*a%m;return(int)p;} void dout(double d){printf("%.12f\n",d);} const int iinf = 1e9; const ll linf = 1e18; const int mod = 1e9+7; const double eps = 1e-10; struct Dijk{ // solve(s, g) or solve(s). // show d and p. typedef pair pli; int n; vectorE; vl d; vi p; void init(const vector&e){n=sz(e);E=e;FOR(i,0,n)sort(rng(E[i]));d.resize(n);p.resize(n);} void o(int S,int G){FOR(i,0,n){d[i]=(i==S)?0:linf;p[i]=-1;}priority_queue,greater>Q;Q.push(pll(0,S));pli t;vectorF;FOR(i,0,n)F.pb(0);ll f;int c=0,s;while(!Q.empty()){t=Q.top();Q.pop();f=t.fi;s=t.se;if(F[s])continue;F[s]=1;c++;if(c==n||s==G)break;each(itr,E[s]){ll ff=itr->fi,ss=itr->se;if((!F[ff])&&(f+ss E; int pt[10000], tn, vn; set ss[10000]; main(){ cin.tie(0); ios::sync_with_stdio(false); cin >> n >> v; cin >> s >> d; s = (d - 1) * 100 + s - 1; cin >> g >> d; g = (d - 1) * 100 + g - 1; FOR(j, 0, n)FOR(i, 0, n)cin >> L[i][j]; E.resize(10000); FOR(i, 0, n)FOR(j, 0, n){ ll _i, _j; if(i > 0){ _i = i-1; _j = j; E[j*100+i].pb(pll(_j*100+_i, L[_i][_j])); } if(i < n-1){ _i = i+1; _j = j; E[j*100+i].pb(pll(_j*100+_i, L[_i][_j])); } if(j > 0){ _i = i; _j = j-1; E[j*100+i].pb(pll(_j*100+_i, L[_i][_j])); } if(j < n-1){ _i = i; _j = j+1; E[j*100+i].pb(pll(_j*100+_i, L[_i][_j])); } } Dijk dij; dij.init(E); d = dij.solve(s, g); if(d >= v){ cout << -1 << endl; return 0; } int mt = 0, co = g; while(dij.p[co] != -1){ co = dij.p[co]; mt++; } FOR(i, 0, 10000){ pt[i] = iinf; } typedef pair tii; priority_queue, greater > que; que.push(tii(pii(0, 0), s)); pt[s] = 0; ss[s].insert(pii(0,0)); tii t; while(true){ t = que.top(); que.pop(); if(t.se == g){ cout << t.fi.fi << endl; return 0; } each(itr, E[t.se]){ tn = t.fi.fi + 1; vn = t.fi.se + itr->se; if((vn < v)&&(pt[itr->fi]>vn)&&ss[itr->fi].find(pii(tn, vn))==ss[itr->fi].end()){ mins(pt[itr->fi], vn); ss[itr->fi].insert(pii(tn, vn)); que.push(tii(pii(tn, vn), itr->fi)); } } } }