#include #include #include #include #include #define S 100007 using namespace std; typedef long double ld; typedef long long ll; vector < int > H[S]; int main(void){ int w,h; int x1,x2,y1,y2; scanf("%d %d %d %d %d %d",&w,&h,&x1,&y1,&x2,&y2); for(int i = 1; i <= h/2;i++){ for(int j = 1; j <= w/2;j++){ int x; scanf("%d",&x); H[i].push_back(x); } } if(x1 > x2){ x1 = w - x1; x2 = w - x2; for(int i = 1; i <= h/2;i++){ reverse(H[i].begin(),H[i].end()); } } if(y1 > y2){ y1 = h - y1; y2 = h - y2; for(int i = 1; i <= h/4;i++){ swap(H[i],H[h/2 - i + 1]); } } int deltaX = abs(x1-x2); int deltaY = abs(y1-y2); int gcd = __gcd(deltaX,deltaY); ld odp = sqrt(deltaX * deltaX + deltaY * deltaY); if(x1 == x2 && y1 == y2){ }else if(x1 == x2){ for(int i = y1/2+2;i <= y2/2 + 1;i++){ odp += (ld)abs(H[i][x1/2] - H[i-1][x1/2]); } }else if(y1 == y2){ for(int i = x1/2+2;i <= x2/2 + 1;i++){ odp += (ld)abs(H[y1/2+1][i-1] - H[y1/2+1][i-2]); } }else{ //tutaj wszystko :c ld a = (ld)(y2-y1) / (ld)(x2-x1); ld b = a * (ld)x1 - (ld)y1; for(int x = x1+1; x <= x2-1;x+=2){ ld y = a*(ld)x + b; int p = (int)y; p /= 2; p *= 2; if(y - (ld)p < 0.00001 || y - (ld)p > 1.99999) continue; p++; /// (x/2,p/2) -> (x/2+1,p/2) odp += abs(H[p/2][x/2-1] - H[p/2][x/2-1]); } for(int y = y1+1; y <= y2-1;y+=2){ ld x = ((ld)y - b)/a; int p = (int)x; p /= 2; p *= 2; if(x - (ld)p < 0.00001 || x - (ld)p > 1.99999) continue; p++; /// (p/2,y/2) -> (p/2,y/2+1) odp += abs(H[y/2][p/2-1] - H[y/2+1][p/2-1]); } for(int x = x1, y = y1; x != x2 && y != y2; x += deltaX/gcd, y += deltaY/gcd){ if(x % 2 == 0 && y % 2 == 0){ ///(x/2,y/2) -> (x/2+1,y/2+1) if(H[y/2+1][x/2-1] > H[y/2][x/2-1] && H[y/2][x/2] > H[y/2][x/2-1] && H[y/2+1][x/2-1] > H[y/2+1][x/2] && H[y/2][x/2] > H[y/2+1][x/2]){ odp += (ld)2 * (ld)min(H[y/2+1][x/2-1], H[y/2][x/2]) - (ld)H[y/2][x/2-1] - (ld)H[y/2+1][x/2]; }else{ odp += (ld)abs(H[y/2][x/2-1] - H[y/2+1][x/2]); } } } } printf("%.8Lf",odp); return 0; }