Advertisement
Guest User

blokada

a guest
Jan 28th, 2020
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define MAXN 1001
  6. const int INF = 0x3f3f3f3f;
  7. int dx[8] = {1, 0, -1, 0, -1, -1, 1, 1};
  8. int dy[8] = {0, -1, 0, 1, -1, 1, 1, -1};
  9.  
  10. char area[MAXN][MAXN];
  11.  
  12. int main() {
  13. ios_base::sync_with_stdio(false);
  14. cin.tie(NULL);
  15. int n, m;
  16. bool no_walls = true;
  17. cin >> n >> m;
  18. for (int i = 0; i < n; i++) {
  19. for (int j = 0; j < m; j++) {
  20. cin >> area[i][j];
  21. if (area[i][j] == '#') no_walls = false;
  22. }
  23. }
  24. if (no_walls) {
  25. cout << m << endl;
  26. return 0;
  27. }
  28. //cijene: bijelo polje - 1, crno polje - 0;
  29. //za svaku tocku u prvom stupcu pronadi najkraci put do bilokoje tocke u
  30. //zadnjem stupcu i odaberi najkraci od svih dobivenih
  31. int min_total_cost = INF;
  32. int price[n][m];
  33. memset(price, INF, sizeof(price));
  34. for (int i = 0; i < n; i++) {
  35. priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq;
  36. int cost = area[i][0] == '.' ? 1 : 0;
  37. price[i][0] = cost;
  38. pq.push({cost, {i, 0}});
  39. while (!pq.empty()) {
  40. pair <int, int> u;
  41. tie(cost, u) = pq.top();
  42. pq.pop();
  43. if (price[u.first][u.second] < cost) continue; //vec pronaden kraci put do ovdje
  44. price[u.first][u.second] = cost;
  45. if (cost > min_total_cost) break; //trenutni trosak je veci od minimalnog do sada - sigurno nije optimalno rj
  46. if (u.second == m - 1) { //pronaden najkraci put od trenutnog pocetka do tocke u zadnjem stupcu
  47. if (cost < min_total_cost) {
  48. min_total_cost = cost;
  49. }
  50. break; //ne treba vise provjeravati za ovu pocetnu tocku
  51. }
  52. for (int i = 0; i < 8; i++) {
  53. pair<int, int> v;
  54. v.first = u.first + dx[i];
  55. v.second = u.second + dy[i];
  56. if (v.first == -1 || v.first == n || v.second == -1 || v.second == m) continue;
  57. int v_cost = cost + (area[v.first][v.second] == '.' ? 1 : 0);
  58. if (v_cost < price[v.first][v.second]) {
  59. price[v.first][v.second] = v_cost;
  60. pq.push({v_cost, v});
  61. }
  62. }
  63. }
  64. }
  65. cout << min_total_cost << endl;
  66. return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement