#define _CRT_SECURE_NO_DEPRECATE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mpair make_pair #define all(v) v.begin(),v.end() using namespace std; typedef long long ll; typedef long double ld; const ld epsylon = 1e-9; int move[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; int main() { freopen("exam.in","r",stdin); freopen("exam.out", "w", stdout); int n,m, A,B; cin >> n >> m >> A >> B; vector a(n); getline(cin, a[0]); for (int i =0;i> sx >> sy >> tx >>ty; sx--; sy--; tx--; ty--; vector > d(n, vector(m, -1)); vector > vis(n, vector(m, 0)); priority_queue > > tc; tc.push(mpair(0, mpair(sx, sy))); d[sx][sy] = 0; while (!tc.empty() && vis[tx][ty] == 0) { int cx = tc.top().second.first; int cy = tc.top().second.second; int dist = -tc.top().first; tc.pop(); if ( vis[cx][cy] ) { continue; } vis[cx][cy] = 1; for (int l = 0;l<4;++l){ int ttx = cx + move[l][0]; int tty = cy + move[l][1]; if (ttx <0 || ttx >= n || tty < 0 || tty >= m) { continue; } if ( vis[ttx][tty]) { continue; } int add = B; if (a[ttx][tty] != a[cx][cy]) { add += A; } if ( d[ttx][tty] == -1 || dist +add < d[ttx][tty]) { d[ttx][tty] = dist +add; tc.push(mpair(-d[ttx][tty], mpair(ttx, tty))); } } } cout << d[tx][ty] << endl; return 0; }