Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับเส้นทางด้วยระยะทางเท่ากับระยะทางแมนฮัตตันใน C++


เราได้รับตัวแปร x1, x2, y1, y2 แทนจุดสองจุดบนระบบพิกัด 2 มิติเป็น (x1, y1) และ (x2, y2) เป้าหมายคือการหาเส้นทางทั้งหมดที่มีระยะทางเท่ากับระยะทางแมนฮัตตันระหว่างจุดทั้งสองนี้

ระยะทางแมนฮัตตัน

แมนฮัตตัน ระยะห่างระหว่างจุดสองจุด (x1, y1) และ (x2, y2) คือ −

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

เอา A=|x1 – x2| และ B=|y1 – y2|

เส้นทางทั้งหมดที่มีระยะทางแมนฮัตตันเท่ากับ MD จะนับเป็น (A+B) ขอบแนวนอนและขอบแนวตั้ง B ดังนั้นการรวมกันที่เป็นไปได้ของขอบ (A+B) แบ่งออกเป็น 2 กลุ่มคือ ( A + B )CB =( A+B )! / (A!)(B!)

นับเส้นทางด้วยระยะทางเท่ากับระยะทางแมนฮัตตันใน C++

ให้เราเข้าใจด้วยตัวอย่าง

ป้อนข้อมูล

ผลผลิต − จำนวนการเคลื่อนที่ที่เป็นไปได้ในทิศทางที่กำหนดในตารางคือ − 6

คำอธิบาย

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.

ป้อนข้อมูล − A =4, B =4, x =2, y =2; เคลื่อนที่ ={2, 1}, { -2, -3 }

ผลผลิต − จำนวนการเคลื่อนที่ที่เป็นไปได้ในทิศทางที่กำหนดในตารางคือ − 2

คำอธิบาย

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

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

ในแนวทางนี้ เราจะสร้างเวกเตอร์ที่แสดงขั้นตอนเป็นคู่ เริ่มข้ามจากจุด x,y เลือกขั้นตอนจากเวกเตอร์และเลือกค่าต่ำสุดที่ถ่ายในทั้งสองทิศทาง (แกน x และแกน y) ขั้นต่ำที่เลือกไว้จะทำให้มีการเคลื่อนไหวมากขึ้น

หากต้องการเคลื่อนที่ไปในทิศทางใดทิศทางหนึ่ง หากตำแหน่ง cur x ( หรือ y ) คือ> n (หรือ m) จำนวนการเคลื่อนที่ที่จะไปถึง n (หรือ m) คือ ( ตำแหน่ง n - cur )/x หากน้อยกว่านั้นจำนวนการเคลื่อนไหวที่จะไปถึง 1 คือ ( ตำแหน่ง cur - 1 )/x.

  • ใช้อาร์เรย์ arr[] ที่มี 0 และ 1

  • ฟังก์ชัน count_cars(int arr[], int size) ใช้อาร์เรย์และความยาวเป็นอินพุตและคืนค่าจำนวนรถที่ผ่าน

  • นับเริ่มต้นเป็น 0

  • อาร์เรย์การเคลื่อนที่จากดัชนี i=0 ถึง i

  • ถ้า arr[i] เป็น 0 ให้ข้ามอาร์เรย์อีกครั้งจากดัชนี j=i+1 ถึง j

  • สำหรับแต่ละ arr[j] เพิ่มขึ้น 1 ครั้ง นับเป็นคู่ (arr[i],arr[j]) คือ (0,1) และ i

  • ในที่สุดเราก็จะได้ยอดรวม

  • ผลตอบแทนนับเป็นผลลัพธ์

ตัวอย่าง

#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;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

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