Alex_tz307

USACO 2017 February Contest, Gold Problem 1. Why Did the Cow Cross the Road

May 30th, 2021 (edited)
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3.  
  4. using namespace std;
  5.  
  6. ifstream fin("visitfj.in");
  7. ofstream fout("visitfj.out");
  8.  
  9. /// pentru a ajunge sa fie cele la distanta 1 pe pozitie divizibila cu 3 face un fel de "du-te-vino"
  10. /// nu exista strategie analoaga cu cea pentru distanta 1 si pentru distanta 2
  11. /// distanta 3 e clar ca poate sa sara
  12. const int MAXN = 100;
  13. const int di[] = {0, 1, 2, 3, 2, 1, 0, -1, -2, -3, -2, -1, -1, 1, 0, 0};
  14. const int dj[] = {3, 2, 1, 0, -1, -2, -3, -2, -1, 0, 1, 2, 0, 0, -1, 1};
  15. int n, T, a[MAXN][MAXN], dp[MAXN][MAXN];
  16.  
  17. void min_self(int &x, int y) {
  18.   x = min(x, y);
  19. }
  20.  
  21. bool inside(int lin, int col) {
  22.   return lin >= 0 && lin < n && col >= 0 && col < n;
  23. }
  24.  
  25. int main() {
  26.   fin >> n >> T;
  27.   for (int i = 0; i < n; ++i)
  28.     for (int j = 0; j < n; ++j) {
  29.       fin >> a[i][j];
  30.       dp[i][j] = INF;
  31.     }
  32.   dp[0][0] = 0;
  33.   priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
  34.   pq.emplace(0, 0);
  35.   int ans = INF;
  36.   while (!pq.empty()) {
  37.     int d = pq.top().first, i = pq.top().second / n, j = pq.top().second % n;
  38.     pq.pop();
  39.     if (dp[i][j] != d)
  40.       continue;
  41.     int dist = (n - 1 - i) + (n - 1 - j);
  42.     if (dist < 3)
  43.       min_self(ans, d + dist * T);
  44.     for (int k = 0; k < 16; ++k) {
  45.       int iv = i + di[k], jv = j + dj[k];
  46.       int cost = d + a[iv][jv] + 3 * T;
  47.       if (inside(iv, jv) && dp[iv][jv] > cost) {
  48.         dp[iv][jv] = cost;
  49.         pq.emplace(dp[iv][jv], iv * n + jv);
  50.       }
  51.     }
  52.   }
  53.   fout << ans << '\n';
  54.   return 0;
  55. }
  56.  
Add Comment
Please, Sign In to add comment