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!)
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
Để 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