Advertisement
SalmaYasser

Untitled

Jan 19th, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.38 KB | None | 0 0
  1. class Solution {
  2. public:
  3.  
  4. bool valid (int r , int c , vector<vector<int>>& grid)
  5. {
  6. return r >= 0 && r < grid.size() && c >=0 && c < grid[0].size() && grid[r][c] != 1;
  7. }
  8.  
  9. int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
  10.  
  11. int rows = grid.size();
  12. if (!rows) return -1;
  13. int cols = grid[0].size();
  14. if (!cols) return -1;
  15.  
  16. pair <int , int> src = {0,0};
  17. pair <int , int> dist = {rows - 1, cols - 1};
  18.  
  19. if (grid[src.first][src.second] == 1 || grid[dist.first][dist.second] == 1 ) return -1;
  20. vector < vector <int> > dir = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
  21. queue <pair <int,int> > q;
  22. vector < vector <bool> > vis (rows, vector <bool> (cols, false));
  23. int res = 1;
  24. q.push(src);
  25. vis[src.first][src.second] = true;
  26. while (!q.empty())
  27. {
  28. int sz = q.size();
  29.  
  30. for (int i = 0 ; i < sz ; i++)
  31. {
  32. pair <int , int> cur = q.front();
  33. q.pop();
  34.  
  35. if (cur == dist)
  36. return res;
  37.  
  38. int cur_r = cur.first;
  39. int cur_c = cur.second;
  40.  
  41.  
  42.  
  43. for (int d = 0 ; d < dir.size(); d ++)
  44. {
  45. int n_r = cur_r + dir[d][0];
  46. int n_c = cur_c + dir[d][1];
  47.  
  48. if (valid(n_r , n_c , grid) && !vis[n_r][n_c])
  49. {
  50. q.push({n_r,n_c});
  51. vis[n_r][n_c] = true;
  52. }
  53. }
  54. }
  55. res++;
  56. }
  57. return -1;
  58. }
  59. };
  60.  
  61. class Solution {
  62. public:
  63. bool valid (int r , int c , vector<vector<int>>& grid)
  64. {
  65. return r >= 0 && r < grid.size() && c >=0 && c < grid[0].size() ;
  66. }
  67. int shortestPath(vector<vector<int>>& grid, int k) {
  68.  
  69. int rows = grid.size();
  70. if (!rows) return -1;
  71. int cols = grid[0].size();
  72. if (!cols) return -1;
  73.  
  74. // pair <int , int> src = {{0,0},k};
  75. pair <int , int> dist = {rows - 1, cols - 1};
  76.  
  77. // if (grid[src.first][src.second] == 1 || grid[dist.first][dist.second] == 1 ) return -1;
  78.  
  79. vector < vector <int> > dir = {{1,0},{-1,0},{0,1},{0,-1}};
  80.  
  81. queue < pair < pair <int,int> , int > > q;
  82.  
  83. vector<vector<vector<int>>> vis(rows, vector<vector<int>>(cols, vector<int>(k+1,0)));
  84.  
  85. int res = 0;
  86. q.push({{0,0},k});
  87.  
  88. vis[0][0][k] = true;
  89. while (!q.empty())
  90. {
  91. int sz = q.size();
  92.  
  93. for (int i = 0 ; i < sz ; i++)
  94. {
  95. pair < pair <int,int> , int > cur = q.front();
  96. q.pop();
  97.  
  98. int cur_r = cur.first.first;
  99. int cur_c = cur.first.second;
  100. int cur_k = cur.second;
  101.  
  102. pair <int , int> cur_point = {cur_r, cur_c};
  103.  
  104. if (cur_point == dist)
  105. return res;
  106.  
  107. for (int d = 0 ; d < dir.size(); d ++)
  108. {
  109. int n_r = cur_r + dir[d][0];
  110. int n_c = cur_c + dir[d][1];
  111.  
  112. if (valid(n_r , n_c , grid) )
  113. {
  114. if ( grid[n_r][n_c] == 1 && cur_k && !vis[n_r][n_c][cur_k -1])
  115. {
  116. q.push({{n_r,n_c},cur_k - 1});
  117. vis[n_r][n_c][cur_k - 1] = true;
  118.  
  119. }
  120.  
  121. else if (grid[n_r][n_c] == 0 && !vis[n_r][n_c][cur_k])
  122. {
  123. q.push({{n_r,n_c},cur_k});
  124. vis[n_r][n_c][cur_k ] = true;
  125.  
  126. }
  127.  
  128.  
  129.  
  130. }
  131. }
  132. }
  133. res++;
  134. }
  135. return -1;
  136.  
  137. }
  138. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement