#define _CRT_SECURE_NO_DEPRECATE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(v) v.begin(),v.end() using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; const ld epsylon = 1e-9; typedef unsigned int ui; inline long double get_time(){ return (long double)clock()/CLOCKS_PER_SEC; }; //ld start_time,end_time; vector > nbs[250000]; char m3x[501][501]; int n, m; int a, b; struct comp { bool operator() (const pair &a, const pair &b) { return a.second > b.second; }}; int startedge; int endedge; int dist[250000]; int part[250000]; int nodes; #define INF 1000000000 int dijkstra() { priority_queue , vector >, comp> pq; for (int i = 0; i < nodes; ++i) { dist[i] = INF; part[i] = 0; } dist[startedge] = 0; pq.push(pair(startedge, 0)); int u, sz, v, w; while (!pq.empty()) { u = pq.top().first; pq.pop(); if(part[u]) continue; for(int i=0; i (v, dist[v])); } } part[u] = 1; // done with u } return dist[endedge]; } int main() { freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); //start_time = get_time(); //program char line[501]; scanf("%d %d %d %d\n", &n, &m,&a,&b); for (int i = 0; i < n; ++i) { scanf("%s\n", m3x[i]); } int num = 0; int starti, startj, endi, endj; scanf("%d %d %d %d", &starti,&startj,&endi,&endj); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (i-1 >= 0) nbs[num].push_back(pair(num-m, (m3x[i][j] != m3x[i-1][j]) ? a+b : b)); if (i+1 < n) nbs[num].push_back(pair(num+m, (m3x[i][j] != m3x[i+1][j]) ? a+b : b)); if (j-1 >= 0) nbs[num].push_back(pair(num-1, (m3x[i][j] != m3x[i][j-1]) ? a+b : b)); if (j+1 < m) nbs[num].push_back(pair(num+1, (m3x[i][j] != m3x[i][j+1]) ? a+b : b)); num++; } } starti--,startj--,endi--,endj--; startedge = starti*m+startj; endedge = endi*m+endj; nodes = num; printf("%d\n", dijkstra()); //end program //end_time=get_time()-start_time; return 0; }