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

Đếm đường dẫn có khoảng cách bằng khoảng cách Manhattan trong C ++

Ta được các biến x1, x2, y1, y2 cho hai điểm trên hệ tọa độ 2D là (x1, y1) và (x2, y2). Mục tiêu là tìm tất cả các con đường có khoảng cách bằng khoảng cách Manhattan giữa hai điểm này.

Khoảng cách Manhattan

Manhattan Khoảng cách giữa hai điểm (x1, y1) và (x2, y2) là -

MD =| x1 - x2 | + | y1 - y2 |

Hãy lấy A =| x1 - x2 | và B =| y1 - y2 |

Tất cả các đường đi với khoảng cách Manhattan bằng MD sẽ có các cạnh được tính là (A + B). A cạnh ngang và B cạnh dọc. Vậy tổ hợp có thể có của (A + B) các cạnh được chia thành 2 nhóm sẽ là (A + B) CB =(A + B)! / (A!) (B!)

Đếm đường dẫn có khoảng cách bằng khoảng cách Manhattan trong C ++

Hãy cho chúng tôi hiểu với các ví dụ

Đầu vào

Đầu ra - Số lượt di chuyển có thể có theo hướng đã cho trong lưới là - 6

Giải thích

Choosing move {1,1} = (1,1) → (2,2) → (3,3) - 3 steps
Choosing move {0,-1} = (3,2) → (3,3) → (3,2) → (3,1) - 3 steps
Total 6 steps.

Đầu vào - A =4, B =4, x =2, y =2; di chuyển ={2, 1}, {-2, -3}

Đầu ra - Số lượt di chuyển có thể có theo hướng đã cho trong lưới là - 2

Giải thích

Choosing move {2,1} = (2,2) → (4,3) - 2 steps
Choosing move {-2,-3} = (2,0) X out of bound
Total 2 steps.

Cách tiếp cận được sử dụng trong chương trình dưới đây như sau

Trong cách tiếp cận này, chúng ta sẽ tạo một vector biểu diễn các bước dưới dạng cặp . Bắt đầu đi ngang từ điểm x, y. Chọn một bước từ vectơ và chọn giá trị nhỏ nhất được thực hiện theo cả hai hướng (trục x và trục y). Mức tối thiểu được chọn sẽ cho phép thực hiện nhiều lượt di chuyển hơn.

Để di chuyển theo một hướng cụ thể, nếu vị trí cur x (hoặc y)> n (hoặc m) thì số lần di chuyển để đạt đến n (hoặc m) là (n - vị trí cur) / x. Nếu nó nhỏ hơn thì số lần di chuyển để đạt đến 1 là (cur position - 1) / x.

  • Lấy một mảng arr [] chứa 0 và 1.

  • Hàm count_cars (int arr [], int size) nhận mảng và độ dài làm đầu vào và trả về số lượng xe chạy qua.

  • Lấy số lượng ban đầu là 0.

  • Đảo ngược mảng từ chỉ mục i =0 đến i

  • Nếu arr [i] là 0, duyệt lại mảng từ chỉ số j =i + 1 đến j

  • Đối với mỗi arr [j] là 1 số gia tăng dưới dạng cặp (arr [i], arr [j]) là (0,1) và i

  • Cuối cùng, chúng tôi sẽ nhận được tổng số.

  • Kết quả là số lượt trả lại.

Ví dụ

#include <bits/stdc++.h>
using namespace std;
long long int bio_coeff(int A, int B){
   long long int temp = 1;
   if (B > A - B){
      B = A - B;
   }
   for (int i = 0; i < B; ++i){
      temp = temp * (A - i);
      temp = temp / (i + 1);
   }
   return temp;
}
long long int Manhattan_distance(int x1, int y1, int x2, int y2){
   int A = abs(x1 - x2);
   int B = abs(y1 - y2);
   int count = bio_coeff(A + B, B);
   return count;
}
int main(){
   int x1 = 6, y1 = 8, x2 = 2, y2 = 10;
   cout<<"Count of paths with distance equal to Manhattan distance are: "<<
   Manhattan_distance(x1, y1, x2, y2);
   return 0;
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra kết quả sau -

Count of paths with distance equal to Manhattan distance are: 15