Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. //#include "graph.h"
  5. #include <unordered_set>
  6.  
  7. enum class State { Not_Visited, In_Proccess, Finished };
  8.  
  9. bool IsOk(const std::pair<int, int>& u, int N, int M) {
  10. if (u.first < 0 || u.first >= N || u.second < 0 || u.second >= M) {
  11. return false;
  12. }
  13. return true;
  14. }
  15.  
  16. std::vector<std::pair<int, int>> GetAdjacentVertices(const std::pair<int, int>& u, int N, int M) {
  17. std::vector<std::pair<int, int>> adjVer;
  18. std::vector<int> delta_x = { 1, -1, 0 };
  19. std::vector<int> delta_y = { 1, -1, 0 };
  20. std::pair<int, int> v;
  21. for (auto dx : delta_x) {
  22. for (auto dy : delta_y) {
  23. if ((dx + dy) % 2 == 0) {
  24. continue;
  25. }
  26. v = std::make_pair(u.first + dx, u.second + dy);
  27. if (IsOk(v, N, M)) {
  28. adjVer.push_back(v);
  29. }
  30.  
  31. }
  32. }
  33. return adjVer;
  34. }
  35.  
  36. std::vector<std::vector<int>> FindPath(const std::vector<std::vector<int>>& matrix) {
  37. const int N = matrix.size();
  38. const int M = matrix[0].size();
  39. std::vector<std::vector<bool>> visited(N, std::vector<bool>(M, false));
  40. std::vector<std::vector<int>> length(N, std::vector<int>(M, -1));
  41. std::queue<std::pair<int, int>> order;
  42. std::pair<int, int> source;
  43. for (int i = 0; i < N; ++i) {
  44. for (int j = 0; j < M; ++j) {
  45. if (matrix[i][j] == 1) {
  46. source = std::make_pair(i, j);
  47. order.push(source);
  48. length[source.first][source.second] = 0;
  49. visited[source.first][source.second] = 1;
  50. }
  51. }
  52. }
  53.  
  54. std::pair<int, int> u;
  55. while (!order.empty()) {
  56. u = order.front();
  57. order.pop();
  58.  
  59. std::vector<std::pair<int, int>> adjVer = GetAdjacentVertices(u, N, M);
  60.  
  61. for (auto iter = adjVer.begin(); iter != adjVer.end(); ++iter) {
  62. if (visited[iter->first][iter->second] == 0) {
  63. order.push(*iter);
  64. length[iter->first][iter->second] = length[u.first][u.second] + 1;
  65. visited[iter->first][iter->second] = 1;
  66. }
  67. }
  68. }
  69. return length;
  70. }
  71.  
  72.  
  73. int main() {
  74. int N, M;
  75. std::cin >> N >> M;
  76. std::vector<std::vector<int>> matrix(N, std::vector<int>(M, 0));
  77.  
  78. for (size_t i = 0; i < N; ++i) {
  79. for (size_t j = 0; j < M; ++j) {
  80. std::cin >> matrix[i][j];
  81. }
  82. }
  83.  
  84. std::vector<std::vector<int>> answer = FindPath(matrix);
  85. for (size_t i = 0; i < N; ++i) {
  86. for (size_t j = 0; j < M; ++j) {
  87. std::cout << answer[i][j] << ' ';
  88. }
  89. std::cout << '\n';
  90. }
  91. system("pause");
  92. return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement