Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3.  
  4. using namespace std;
  5. #define f first
  6. #define s second
  7. int main() {
  8.     ios_base::sync_with_stdio(0);cin.tie(0); cout.tie(0);
  9.     int n, m, x, y;
  10.     const int k = 6;
  11.     cin >> n >> m >> x >> y;
  12.     x--; y--;
  13.     vector <int> chn(6);
  14.     vector <vector <pair<int, int>>> moves(6);
  15.     moves[0] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
  16.     moves[1] = {{-2, -1}, {-2, 1}, {2, 1}, {2, -1},
  17.              {1, 2}, {1, -2}, {-1, 2}, {-1, -2}};
  18.     moves[2] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
  19.     moves[3] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
  20.     moves[4] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1},
  21.              {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
  22.     moves[5] = moves[4];
  23.     for (int i = 0; i < 6; i++) cin >> chn[i];
  24.     vector <vector <bool>> free(n, vector <bool> (m));
  25.     for (int i = 0; i < n; i++) {
  26.         for (int j = 0; j < m; j++) {
  27.             char c;
  28.             cin >> c;
  29.             if (c == '#') free[i][j] = 1;
  30.         }
  31.     }
  32.     ll inf = 1e18;
  33.     vector<vector<vector<ll>>> d(n, vector <vector<ll>> (m, vector<ll>(k, inf)));
  34.     set<pair<ll, pair<pair<int, int>, int>>> st;
  35.     d[x][y][0] = 0;
  36.     st.insert({d[x][y][0], {{x, y}, 0}});
  37.     while (!st.empty()) {
  38.         auto v = st.begin()->second;
  39.         st.erase(st.begin());
  40.         for (int i = 0; i < 6; ++i){
  41.             if (d[v.f.f][v.f.s][i] > d[v.f.f][v.f.s][v.s] + chn[i]){
  42.                 st.erase({d[v.f.f][v.f.s][i], {{v.f.f, v.f.s}, i}});
  43.                 d[v.f.f][v.f.s][i] = d[v.f.f][v.f.s][v.s] + chn[i];
  44.                 st.insert({d[v.f.f][v.f.s][i], {{v.f.f, v.f.s}, i}});
  45.             }
  46.         }
  47.         for (auto &j : moves[v.s]){
  48.             int go_x = v.f.f + j.first, go_y = v.f.s + j.second;
  49.             if (go_x >= 0 && go_x < n && go_y >= 0 && go_y < m && !free[go_x][go_y]) {
  50.                 if (v.s >= 2 && v.s < 5){
  51.                     go_x -= j.first, go_y -= j.second;
  52.                     for (int tmp = 0; tmp < n*m; tmp++) {
  53.                         go_x += j.first, go_y += j.second;
  54.                         if (go_x < 0 || go_x >= n || go_y < 0 || go_y >= m || free[go_x][go_y]) break;
  55.                         if (d[go_x][go_y][v.s] > d[v.f.f][v.f.s][v.s] + 1){
  56.                             st.erase({d[go_x][go_y][v.s], {{go_x, go_y}, v.s}});
  57.                             d[go_x][go_y][v.s] = d[v.f.f][v.f.s][v.s] + 1;
  58.                             st.insert({d[go_x][go_y][v.s], {{go_x, go_y}, v.s}});
  59.                         }
  60.                     }
  61.                 }
  62.                 else{
  63.                     if (d[go_x][go_y][v.s] > d[v.f.f][v.f.s][v.s] + 1){
  64.                         st.erase({d[go_x][go_y][v.s], {{go_x, go_y}, v.s}});
  65.                         d[go_x][go_y][v.s] = d[v.f.f][v.f.s][v.s] + 1;
  66.                         st.insert({d[go_x][go_y][v.s], {{go_x, go_y}, v.s}});
  67.                     }
  68.                 }
  69.             }
  70.         }
  71.     }
  72.     vector<vector<ll>> res(n, vector<ll>(m, inf));
  73.     for (int i = 0; i < n; ++i){
  74.         for (int j = 0; j < m; ++j){
  75.             for (int t = 0;  t< k; ++t){
  76.                 res[i][j] = min(res[i][j], d[i][j][t]);
  77.             }
  78.         }
  79.     }
  80.     pair<int, int> ans = {x, y};
  81.     for (int i = 0; i < n; i++) {
  82.         for (int j = 0; j < m; j++) {
  83.             if (res[i][j] > res[ans.first][ans.second] && !free[i][j]) ans = {i, j};
  84.         }
  85.     }
  86.  
  87.     cout << ans.first + 1 << " " << ans.second + 1 << " ";
  88.     if (res[ans.first][ans.second] == inf) cout << "INF";
  89.     else cout << res[ans.first][ans.second];
  90.  
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement