Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <unordered_set>
  5. #include <unordered_map>
  6. #include <algorithm>
  7. #include <iomanip>
  8. #include <cstring>
  9. #include <queue>
  10.  
  11. using namespace std;
  12.  
  13. void bfs(const vector<vector<int>> &map,
  14. int startPoint,
  15. std::vector<std::pair<int, int>> &pointsOfInterest,
  16. int N,
  17. int M,
  18. vector<vector<int>> &outDistances) {
  19.  
  20. // all the ones left to visit
  21. std::queue<std::pair<int, int>> toVisit;
  22. toVisit.emplace(pointsOfInterest[startPoint]);
  23.  
  24. // all the nodes that we have visited
  25. std::vector<bool> visited;
  26. visited.resize(N * M, false);
  27.  
  28. // all the nodes that we have added
  29. std::vector<bool> added;
  30. added.resize(N * M, false);
  31.  
  32. // distances
  33. std::vector<int> distances;
  34. distances.resize(N * M, 0);
  35.  
  36. while(!toVisit.empty()) {
  37.  
  38. // get the stuff to visit
  39. int i = toVisit.front().first;
  40. int j = toVisit.front().second;
  41. toVisit.pop();
  42.  
  43. // mark as visited
  44. visited[i * M + j] = true;
  45.  
  46. if(i + 1 < N && !visited[(i + 1) * M + j] && map[i + 1][j] != 1 && !added[(i + 1) * M + j]) {
  47. toVisit.push(std::make_pair(i+1, j));
  48. distances[(i + 1) * M + j] = distances[i * M + j] + 1;
  49. added[(i + 1) * M + j] = true;
  50. }
  51.  
  52. if(i - 1 >= 0 && !visited[(i - 1) * M + j] && map[i - 1][j] != 1 && !added[(i - 1) * M + j]) {
  53. toVisit.push(std::make_pair(i - 1, j));
  54. distances[(i - 1) * M + j] = distances[i * M + j] + 1;
  55. added[(i - 1) * M + j] = true;
  56. }
  57.  
  58. if(j + 1 < M && !visited[i * M + j + 1] && map[i][j + 1] != 1 && !added[i * M + j + 1]) {
  59. toVisit.push(std::make_pair(i, j + 1));
  60. distances[i * M + j + 1] = distances[i * M + j] + 1;
  61. added[i * M + j + 1] = true;
  62. }
  63.  
  64. if(j - 1 >= 0 && !visited[i * M + j - 1] && map[i][j - 1] != 1 && !added[i* M + j - 1]) {
  65. toVisit.push(std::make_pair(i, j - 1));
  66. distances[i * M + j - 1] = distances[i * M + j] + 1;
  67. added[i * M + j - 1] = true;
  68. }
  69. }
  70.  
  71. // set the output distances
  72. for(int i = 0; i < pointsOfInterest.size(); ++i) {
  73. if(visited[pointsOfInterest[i].first * M + pointsOfInterest[i].second]) {
  74. outDistances[startPoint][i] = distances[pointsOfInterest[i].first * M + pointsOfInterest[i].second];
  75. }
  76. }
  77. }
  78.  
  79. int findDistance(const vector<vector<int>> &map, int x, int y) {
  80.  
  81. int N = map.size();
  82. int M = map[0].size();
  83.  
  84. std::vector<std::pair<int, int>> toVisit = {{0, 0}};
  85. for(int i = 0; i < N; i++) {
  86. for(int j = 0; j < M; j++) {
  87.  
  88. // check if it is start or end
  89. bool isEnd = i == x && j == y;
  90. bool isStart = i == 0 && j == 0;
  91.  
  92. if(map[i][j] == 2 && !isStart && !isEnd) {
  93. toVisit.emplace_back(i, j);
  94. }
  95. }
  96. }
  97. toVisit.emplace_back(x, y);
  98.  
  99. // init the distances to -1
  100. vector<vector<int>> distances;
  101. distances.resize(toVisit.size());
  102. for(auto &d : distances) {
  103. d.resize(toVisit.size(), -1);
  104. }
  105.  
  106. // go through all the nodes we need to visit
  107. for(int i = 0; i < toVisit.size(); ++i) {
  108. bfs(map, i, toVisit, N, M, distances);
  109. }
  110.  
  111. // if one of them can not be reached from the source return -1
  112. for(int i = 0; i < toVisit.size(); ++i) {
  113. if(distances[0][i] == -1) {
  114. return -1;
  115. }
  116. }
  117.  
  118. // check all permutations
  119. std::vector<int> permutation;
  120. permutation.reserve(toVisit.size());
  121. for(int i = 1; i < toVisit.size() - 1; ++i) {
  122. permutation.emplace_back(i);
  123. }
  124.  
  125. // if we don't have anything just return
  126. if(permutation.empty()) {
  127. return distances[0][toVisit.size() - 1];
  128. }
  129.  
  130. // figure out the minimum distance
  131. int minDist = std::numeric_limits<int>::max();
  132. do {
  133.  
  134. // distance to the first in the permutation
  135. int dist = distances[0][permutation.front()];
  136.  
  137. // sum up the distance
  138. for(int i = 0; i < permutation.size() - 1; ++i) {
  139. dist += distances[i][i + 1];
  140. }
  141.  
  142. // distance from the last in the permutation
  143. dist += distances[permutation.back()][toVisit.size() - 1];
  144.  
  145. // figure out the minimum distance
  146. minDist = std::min(minDist, dist);
  147.  
  148. } while (std::next_permutation(permutation.begin(), permutation.end()) );
  149.  
  150. return minDist;
  151. }
  152.  
  153.  
  154.  
  155. int main() {
  156.  
  157. // init the distances to -1
  158. vector<vector<int>> map;
  159. map.resize(100);
  160. for(auto &d : map) {
  161. d.resize(100, 0);
  162. }
  163.  
  164. //for(int i = 0; i < 10; i++) {
  165. // map[i * 10][i * 10] = 2;
  166. //}
  167.  
  168.  
  169. //std::cout << findDistance(map, 99, 99);
  170. std::cout << findDistance({{0, 0, 0, 0, 1},
  171. {1, 1, 1, 0, 0},
  172. {1, 1, 2, 1, 0},
  173. {1, 1, 1, 1, 2}}, 3, 4);
  174.  
  175. return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement