Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define sc second
- #define fr first
- #define ll long long
- #define pii pair <int, int>
- using namespace std;
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0); cout.tie(0);
- int n, m, x, y;
- cin >> n >> m >> x >> y;
- x--; y--;
- vector <int> chn(6);
- vector <vector <pii>> go(6);
- go[0] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
- go[1] = {{-2, -1}, {-2, 1}, {2, 1}, {2, -1},
- {1, 2}, {1, -2}, {-1, 2}, {-1, -2}};
- go[2] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
- go[3] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
- go[4] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1},
- {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
- go[5] = go[4];
- for (int i = 0; i < 6; i++) cin >> chn[i];
- vector <vector <bool>> free(n, vector <bool> (m));
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- char c;
- cin >> c;
- if (c == '#') free[i][j] = 1;
- }
- }
- ll inf = 1e18;
- vector<vector <ll>> d(n, vector <ll> (m, inf));
- vector<vector <int>> prev(n, vector <int> (m));
- set <pair <ll, pii>> q;
- d[x][y] = 0;
- q.insert({d[x][y], {x, y}});
- while (!q.empty()) {
- pii v = q.begin()->sc;
- q.erase(q.begin());
- for (int i = 0; i < 6; i++) {
- for (auto j : go[i]) {
- int go_x = v.fr + j.fr, go_y = v.sc + j.sc;
- if (go_x >= 0 && go_x < n && go_y >= 0 && go_y < m && !free[go_x][go_y]) {
- if (i >= 2 && i < 5) {
- go_x -= j.fr, go_y -= j.sc;
- for (int k = 0; k < 8; k++) {
- go_x += j.fr, go_y += j.sc;
- if (go_x < 0 || go_x >= n || go_y < 0 || go_y >= m || free[go_x][go_y]) break;
- if (d[v.fr][v.sc] + 1 + (prev[v.fr][v.sc] == i ? 0 : chn[i]) < d[go_x][go_y]) {
- q.erase({d[go_x][go_y], {go_x, go_y}});
- d[go_x][go_y] = d[v.fr][v.sc] + 1 + (prev[v.fr][v.sc] == i ? 0 : chn[i]);
- prev[go_x][go_y] = i;
- q.insert({d[go_x][go_y], {go_x, go_y}});
- }
- }
- } else if (d[v.fr][v.sc] + 1 + (prev[v.fr][v.sc] == i ? 0 : chn[i]) < d[go_x][go_y]) {
- q.erase({d[go_x][go_y], {go_x, go_y}});
- d[go_x][go_y] = d[v.fr][v.sc] + 1 + (prev[v.fr][v.sc] == i ? 0 : chn[i]);
- prev[go_x][go_y] = i;
- q.insert({d[go_x][go_y], {go_x, go_y}});
- }
- }
- }
- }
- }
- pii ans = {x, y};
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (d[i][j] > d[ans.fr][ans.sc] && !free[i][j]) ans = {i, j};
- }
- }
- cout << ans.fr + 1 << " " << ans.sc + 1 << " ";
- if (d[ans.fr][ans.sc] == inf) cout << "INF";
- else cout << d[ans.fr][ans.sc];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement