Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- typedef long long ll;
- using namespace std;
- #define f first
- #define s second
- int main() {
- ios_base::sync_with_stdio(0);cin.tie(0); cout.tie(0);
- int n, m, x, y;
- const int k = 6;
- cin >> n >> m >> x >> y;
- x--; y--;
- vector <int> chn(6);
- vector <vector <pair<int, int>>> moves(6);
- moves[0] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
- moves[1] = {{-2, -1}, {-2, 1}, {2, 1}, {2, -1},
- {1, 2}, {1, -2}, {-1, 2}, {-1, -2}};
- moves[2] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
- moves[3] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
- moves[4] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1},
- {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
- moves[5] = moves[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<vector<ll>>> d(n, vector <vector<ll>> (m, vector<ll>(k, inf)));
- set<pair<ll, pair<pair<int, int>, int>>> st;
- d[x][y][0] = 0;
- st.insert({d[x][y][0], {{x, y}, 0}});
- while (!st.empty()) {
- auto v = st.begin()->second;
- st.erase(st.begin());
- for (int i = 0; i < 6; ++i){
- if (d[v.f.f][v.f.s][i] > d[v.f.f][v.f.s][v.s] + chn[i]){
- st.erase({d[v.f.f][v.f.s][i], {{v.f.f, v.f.s}, i}});
- d[v.f.f][v.f.s][i] = d[v.f.f][v.f.s][v.s] + chn[i];
- st.insert({d[v.f.f][v.f.s][i], {{v.f.f, v.f.s}, i}});
- }
- }
- for (auto &j : moves[v.s]){
- int go_x = v.f.f + j.first, go_y = v.f.s + j.second;
- if (go_x >= 0 && go_x < n && go_y >= 0 && go_y < m && !free[go_x][go_y]) {
- if (v.s >= 2 && v.s < 5){
- go_x -= j.first, go_y -= j.second;
- for (int tmp = 0; tmp < n*m; tmp++) {
- go_x += j.first, go_y += j.second;
- if (go_x < 0 || go_x >= n || go_y < 0 || go_y >= m || free[go_x][go_y]) break;
- if (d[go_x][go_y][v.s] > d[v.f.f][v.f.s][v.s] + 1){
- st.erase({d[go_x][go_y][v.s], {{go_x, go_y}, v.s}});
- d[go_x][go_y][v.s] = d[v.f.f][v.f.s][v.s] + 1;
- st.insert({d[go_x][go_y][v.s], {{go_x, go_y}, v.s}});
- }
- }
- }
- else{
- if (d[go_x][go_y][v.s] > d[v.f.f][v.f.s][v.s] + 1){
- st.erase({d[go_x][go_y][v.s], {{go_x, go_y}, v.s}});
- d[go_x][go_y][v.s] = d[v.f.f][v.f.s][v.s] + 1;
- st.insert({d[go_x][go_y][v.s], {{go_x, go_y}, v.s}});
- }
- }
- }
- }
- }
- vector<vector<ll>> res(n, vector<ll>(m, inf));
- for (int i = 0; i < n; ++i){
- for (int j = 0; j < m; ++j){
- for (int t = 0; t< k; ++t){
- res[i][j] = min(res[i][j], d[i][j][t]);
- }
- }
- }
- pair<int, int> ans = {x, y};
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (res[i][j] > res[ans.first][ans.second] && !free[i][j]) ans = {i, j};
- }
- }
- cout << ans.first + 1 << " " << ans.second + 1 << " ";
- if (res[ans.first][ans.second] == inf) cout << "INF";
- else cout << res[ans.first][ans.second];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement