#include #include #include using namespace std; const int MAXN = 512; struct vertex{ int x, y, dist; vertex(){} vertex ( int _x, int _y, int _dist ) { x = _x; y = _y; dist = _dist; } bool operator< ( vertex t1 )const { return dist > t1.dist; } }; int D[MAXN][MAXN]; int used[MAXN][MAXN]; int N, M, A, B; char a[MAXN][MAXN]; int dx[] = { 1, 0, -1, 0 }; int dy[] = { 0, -1, 0, 1 }; int sx, sy, fx, fy; priority_queue q; void scan(){ scanf ( "%d%d%d%d", &N, &M, &A, &B ); for ( int i = 0; i < N; ++i ) scanf ( "%s", a[i] ); scanf ( "%d%d%d%d", &sx, &sy, &fx, &fy ); } void dijkstra( int x, int y ){ for ( int i = 0; i < N; ++i ) for ( int j = 0; j < M; ++j ) D[i][j] = 1e9; D[x][y] = 0; q.push ( vertex ( x, y, 0 ) ); while ( !q.empty() ){ vertex t = q.top(); x = t.x; y = t.y; q.pop(); if ( used[x][y] ) continue; used[x][y] = 1; for ( int k = 0; k < 4; ++k ){ int nx = x + dx[k], ny = y + dy[k]; if ( nx < 0 || ny < 0 || nx >= N && ny >= M ) continue; if ( used[nx][ny] ) continue; if ( D[nx][ny] > D[x][y] + B + ( a[x][y] != a[nx][ny] ) * A ){ D[nx][ny] = D[x][y] + B + ( a[x][y] != a[nx][ny] ) * A ; q.push ( vertex ( nx, ny, D[nx][ny] ) ); } } } } void solve(){ --sx; --sy; --fx; --fy; dijkstra ( sx, sy ); printf ( "%d\n", D[fx][fy] ); } int main(){ freopen ( "exam.in", "r", stdin ); freopen ( "exam.out", "w", stdout ); scan(); solve(); }