#include typedef long long ll; typedef unsigned long long ull; #define FOR(i,a,b) for(int (i)=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() using namespace std; class DesertChapman { public: void solve(void) { int N,V,sx,sy,gx,gy; cin>>N>>V>>sx>>sy>>gx>>gy; --sx,--sy,--gx,--gy; vector> fld(N,vector(N,0)); REP(i,N) REP(j,N) cin>>fld[i][j]; const int inf = (1<<30); // cost[y][x] := (x,y) までの到達コストの最小値 vector> cost(N,vector(N,inf)); queue> que; // 幅優先探索でやる que.emplace(sx,sy,0,0); // 最悪ゴールまで辿りつけないケースは全探索になるので // O(N^2*V) <= 10^10 となる。 // // ただし障害物がないので // ((横の移動最大回数)+(縦の移動最大回数))*max(fld[y][x]) < V なら到達可能なので // O(N^2*V) <= 1.8*10^7 程度の計算量になる。 // while (!que.empty()) { int x,y,c,t; tie(x,y,c,t) = que.front(); que.pop(); const int dx[] = {1,0,-1,0}; const int dy[] = {0,-1,0,1}; REP(d,4) { int nx = x+dx[d]; int ny = y+dy[d]; if (nx < 0 || ny < 0 || N <= nx || N <= ny) continue; int nc = c+fld[ny][nx]; // 体力が付きてしまった if (nc >= V) continue; // 到達できたら終了。幅優先なのでこれが最短時間 if (nx==gx && ny==gy) { cout< nc) { cost[ny][nx] = c+fld[ny][nx]; que.emplace(nx,ny,cost[ny][nx],t+1); } } } cout<<-1<solve(); delete obj; return 0; } #endif