/* TASK: exam LANG: C++ FROM: CodeIT Round6 IDEA: shortest path NOTES: - AUTHOR: Yasen Trifonov */ #include #include #include #include #include #define mp make_pair #define MAXN (1 << 9) using namespace std; int n, m; char grid[MAXN][MAXN]; int d[MAXN][MAXN], used[MAXN][MAXN]; int A, B; int sx, sy; int ex, ey; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, -1, 1}; inline void solve() { memset(d, -1, sizeof(d)); priority_queue< pair > pq; pq.push( mp(0, sx*m+sy) ); d[sx][sy] = 0; while (pq.size()) { int cost = -pq.top().first, curx = pq.top().second / m, cury = pq.top().second % m; pq.pop(); if (used[curx][cury]) continue; used[curx][cury] = true; for (int i=0; i < 4; ++i) { int nx = curx+dx[i], ny = cury+dy[i]; if (nx < 0 || nx >= n) continue; if (ny < 0 || ny >= m) continue; if (used[nx][ny]) continue; int add = (grid[nx][ny] != grid[curx][cury]) * A + B; if (d[nx][ny] == -1 || d[nx][ny] > cost + add) { d[nx][ny] = cost + add; pq.push( mp(-d[nx][ny], nx*m + ny) ); } } } solved:; assert( d[ex][ey] != -1 ); printf("%d\n", d[ex][ey]); } inline void read() { scanf("%d%d%d%d", &n, &m, &A, &B); assert(n > 0); assert(m > 0); assert(n < MAXN); assert(m < MAXN); assert(A > 0); assert(B > 0); assert(A < 1001); assert(B < 1001); for (int i=0; i < n; ++i) { scanf("%s", grid[i]); for (int j=0; j < m; ++j) { assert(grid[i][j] >= '0'); assert(grid[i][j] <= '2'); } } scanf("%d%d", &sx, &sy); sx --; sy --; assert(sx >= 0); assert(sx < n); assert(sy >= 0); assert(sy < m); scanf("%d%d", &ex, &ey); ex --; ey --; assert(ex >= 0); assert(ex < n); assert(ey >= 0); assert(ey < m); } int main() { freopen("exam.in", "r", stdin); freopen("exam.out", "w", stdout); read(); solve(); return 0; }