Computer >> Máy Tính >  >> Lập trình >> C ++

Mê cung trong C ++

Giả sử có một quả bóng trong một mê cung với không gian trống và những bức tường. Bây giờ quả bóng có thể đi qua những con đường trống bằng cách lăn theo bất kỳ hướng nào như lên, xuống, sang trái hoặc sang phải, nhưng nó sẽ không ngừng lăn cho đến khi va vào tường. Khi quả bóng dừng lại, nó có thể chọn hướng tiếp theo.

Chúng ta phải bắt đầu vị trí bóng, đích đến và mê cung, chúng ta phải kiểm tra xem quả bóng có thể dừng lại ở đích hay không. Mê cung được thể hiện bằng một mảng 2D. Ở đây 1 biểu thị bức tường và 0 biểu thị không gian trống. Các đường viền của mê cung đều là những bức tường. Tọa độ điểm xuất phát và điểm đến được biểu thị bằng các chỉ số hàng và cột.

Vì vậy, nếu đầu vào giống như một mê cung được biểu diễn bởi một mảng 2D

0 0 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 1
0 0 0 0 0

vị trí bắt đầu là (0, 4) vị trí đích là (4, 4), thì kết quả đầu ra sẽ là true, Một cách có thể là - trái để xuống sang phải .

Mê cung trong C ++

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool hasPath(vector<vector<int<>& grid, vector<int<& start, vector<int<& destination) {
      int n = grid.size();
      int m = grid[0].size();
      queue<vector<int< > q;
      q.push(start);
      set<vector<int< > visited;
      visited.insert(start);
      while (!q.empty()) {
         vector<int< curr = q.front();
         q.pop();
         int x = curr[0];
         int y = curr[1];
         if (destination[0] == x && destination[1] == y)
            return true;
         int i = x;
         while (i + 1 < n && !grid[i + 1][y])
            i++;
         if (!visited.count({ i, y })) {
            visited.insert({ i, y });
            q.push({ i, y });
         }
         i = x;
         while (i - 1 >= 0 && !grid[i - 1][y])
            i--;
         if (!visited.count({ i, y })) {
            visited.insert({ i, y });
            q.push({ i, y });
         }
         i = y;
         while (i + 1 < m && !grid[x][i + 1])
            i++;
         if (!visited.count({ x, i })) {
            visited.insert({ x, i });
            q.push({ x, i });
         }
         i = y;
         while (i - 1 >= 0 && !grid[x][i - 1])
            i--;
         if (!visited.count({ x, i })) {
            visited.insert({ x, i });
            q.push({ x, i });
         }
      }
      return false;
   }
};
main(){
   Solution ob;
   vector<vector<int<> v = {{0,0,1,0,0},{0,0,0,0,0},{0,0,0,1,0},{1,1,0,1,1},{0,0,0,0,0}};
   vector<int< v1 = {0,4}, v2 = {4,4};
   cout << (ob.hasPath(v, v1, v2));
}

Đầu vào

{{0,0,1,0,0},{0,0,0,0,0},{0,0,0,1,0},{1,1,0,1,1},{0,0,0,0,0}},{0,4},{4,4}

Đầu ra

1