#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #if __has_include() #include using namespace atcoder; #endif #define GET_MACRO(_1, _2, _3, NAME, ...) NAME #define _rep(i, n) _rep2(i, 0, n) #define _rep2(i, a, b) for(int i = (int)(a); i < (int)(b); i++) #define rep(...) GET_MACRO(__VA_ARGS__, _rep2, _rep)(__VA_ARGS__) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() using i64 = long long; template bool chmin(T& a, const U& b) { return (b < a) ? (a = b, true) : false; } template bool chmax(T& a, const U& b) { return (b > a) ? (a = b, true) : false; } templateistream& operator>>(istream&i,vector&v){rep(j,v.size())i>>v[j];return i;} templatestring join(vector&v){stringstream s;rep(i,v.size())s<<' '<ostream& operator<<(ostream&o,vector&v){if(v.size())o<string join(vector>&vv){string s="\n";rep(i,vv.size())s+=join(vv[i])+"\n";return s;} templateostream& operator<<(ostream&o,vector>&vv){if(vv.size())o< vector dijkstra(vector>>& graph, int start) { int n = graph.size(); vector res(n, 2e18); res[start] = 0; priority_queue, vector>, greater>> que; que.push({0, start}); while(!que.empty()) { auto[c, v] = que.top(); que.pop(); if(res[v] < c) continue; for(auto[nxt, cost]: graph[v]) { auto x = c + cost; if(x < res[nxt]) { res[nxt] = x; que.push({x, nxt}); } } } return res; } int main(){ int h, w; cin >> h >> w; i64 u, d, r, l, k, p; cin >> u >> d >> r >> l >> k >> p; int sx, sy, tx, ty; cin >> sx >> sy >> tx >> ty; sx--, sy--, tx--, ty--; vector s(h); cin >> s; vector dp(h, vector(w, 2e18)); vector edge(h * w, vector>()); rep(i, h) rep(j, w){ if (s[i][j] == '#') continue; if (i > 0){ if (s[i - 1][j] == '@'){ edge[i * w + j].emplace_back((i - 1) * w + j, u + p); } else if (s[i - 1][j] == '.'){ edge[i * w + j].emplace_back((i - 1) * w + j, u); } } if (j > 0){ if (s[i][j - 1] == '@'){ edge[i * w + j].emplace_back(i* w + j - 1, l + p); } else if (s[i][j - 1] == '.'){ edge[i * w + j].emplace_back(i * w + j - 1, l); } } if (i + 1 < h){ if (s[i + 1][j] == '@'){ edge[i * w + j].emplace_back((i + 1) * w + j, d + p); } else if (s[i + 1][j] == '.'){ edge[i * w + j].emplace_back((i + 1) * w + j, d); } } if (j + 1 < w){ if (s[i][j + 1] == '@'){ edge[i * w + j].emplace_back(i* w + j + 1, r + p); } else if (s[i][j + 1] == '.'){ edge[i * w + j].emplace_back(i * w + j + 1, r); } } } auto ddd = dijkstra(edge, sx * w + sy); cout << (ddd[tx * w + ty] <= k? "Yes": "No") << endl; }