Given two points (x1, y1) and (x2, y2) in 2-D coordinate system. The task is to count all the paths whose distance is equal to the Manhattan distance between both the given points.
Examples:
Input: x1 = 2, y1 = 3, x2 = 4, y2 = 5
Output: 6
Input: x1 = 2, y1 = 6, x2 = 4, y2 = 9
Output: 10
Approach: The Manhattan distance between the points (x1, y1) and (x2, y2) will be abs(x1 – x2) + abs(y1 – y2)
Let abs(x1 – x2) = m and abs(y1 – y2) = n
Every path with distance equal to the Manhattan distance will always have m + n edges, m horizontal and n vertical edges. Hence this is a basic case of Combinatorics which is based upon group formation. The idea behind this is the number of ways in which (m + n) different things can be divided into two groups, one containing m items and the other containing n items which is given by m + nCn i.e. (m + n)! / m! * n!.
Below is the implementation of the above approach:
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
#define ll long long int // Function to return the value of nCk ll binomialCoeff( int n, int k)
{ ll res = 1;
// Since C(n, k) = C(n, n-k)
if (k > n - k)
k = n - k;
// Calculate value of
// [n * (n-1) *---* (n-k+1)] /
// [k * (k-1) *---* 1]
for ( int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
} // Function to return the number of paths ll countPaths( int x1, int y1, int x2, int y2)
{ // Difference between the 'x'
// coordinates of the given points
int m = abs (x1 - x2);
// Difference between the 'y'
// coordinates of the given points
int n = abs (y1 - y2);
return (binomialCoeff(m + n, n));
} // Driver code int main()
{ int x1 = 2, y1 = 3, x2 = 4, y2 = 5;
cout << countPaths(x1, y1, x2, y2);
return 0;
} |
// Java implementation of the approach class GfG
{ //static long ll long long int // Function to return the value of nCk static long binomialCoeff( int n, int k)
{ long res = 1 ;
// Since C(n, k) = C(n, n-k)
if (k > n - k)
k = n - k;
// Calculate value of
// [n * (n-1) *---* (n-k+1)] /
// [k * (k-1) *---* 1]
for ( int i = 0 ; i < k; ++i)
{
res *= (n - i);
res /= (i + 1 );
}
return res;
} // Function to return the number of paths static long countPaths( int x1, int y1, int x2, int y2)
{ // Difference between the 'x'
// coordinates of the given points
int m = Math.abs(x1 - x2);
// Difference between the 'y'
// coordinates of the given points
int n = Math.abs(y1 - y2);
return (binomialCoeff(m + n, n));
} // Driver code public static void main(String[] args)
{ int x1 = 2 , y1 = 3 , x2 = 4 , y2 = 5 ;
System.out.println(countPaths(x1, y1, x2, y2));
} } // This code is contributed by // Prerna Saini. |
# Python3 implementation of the approach # Function to return the value of nCk def binomialCoeff(n, k):
res = 1
# Since C(n, k) = C(n, n-k)
if (k > n - k):
k = n - k
# Calculate value of
# [n * (n-1) *---* (n-k+1)] /
# [k * (k-1) *---* 1]
for i in range (k):
res * = (n - i)
res / / = (i + 1 )
return res
# Function to return the number # of paths def countPaths(x1, y1, x2, y2):
# Difference between the 'x'
# coordinates of the given points
m = abs (x1 - x2)
# Difference between the 'y'
# coordinates of the given points
n = abs (y1 - y2)
return (binomialCoeff(m + n, n))
# Driver code x1, y1, x2, y2 = 2 , 3 , 4 , 5
print (countPaths(x1, y1, x2, y2))
# This code is contributed # by Mohit Kumar |
// C# implementation of the approach using System;
class GFG
{ // Function to return the value of nCk static long binomialCoeff( int n, int k)
{ long res = 1;
// Since C(n, k) = C(n, n-k)
if (k > n - k)
k = n - k;
// Calculate value of
// [n * (n-1) *---* (n-k+1)] /
// [k * (k-1) *---* 1]
for ( int i = 0; i < k; ++i)
{
res *= (n - i);
res /= (i + 1);
}
return res;
} // Function to return the number of paths static long countPaths( int x1, int y1,
int x2, int y2)
{ // Difference between the 'x'
// coordinates of the given points
int m = Math.Abs(x1 - x2);
// Difference between the 'y'
// coordinates of the given points
int n = Math.Abs(y1 - y2);
return (binomialCoeff(m + n, n));
} // Driver code public static void Main()
{ int x1 = 2, y1 = 3, x2 = 4, y2 = 5;
Console.Write(countPaths(x1, y1, x2, y2));
} } // This code is contributed by // Akanksha Rai |
<?php // PHP implementation of the approach //static long ll long long int // Function to return the value of nCk function binomialCoeff( $n , $k )
{ $res = 1;
// Since C(n, k) = C(n, n-k)
if ( $k > $n - $k )
$k = $n - $k ;
// Calculate value of
// [n * (n-1) *---* (n-k+1)] /
// [k * (k-1) *---* 1]
for ( $i = 0; $i < $k ; ++ $i )
{
$res *= ( $n - $i );
$res /= ( $i + 1);
}
return $res ;
} // Function to return the number of paths function countPaths( $x1 , $y1 , $x2 , $y2 )
{ // Difference between the 'x'
// coordinates of the given points
$m = abs ( $x1 - $x2 );
// Difference between the 'y'
// coordinates of the given points
$n = abs ( $y1 - $y2 );
return (binomialCoeff( $m + $n , $n ));
} // Driver code { $x1 = 2; $y1 = 3; $x2 = 4; $y2 = 5;
echo (countPaths( $x1 , $y1 , $x2 , $y2 ));
} // This code is contributed by // Code_Mech. |
<script> // javascript implementation of the approach // Function to return the value of nCk function binomialCoeff(n, k)
{ var res = 1;
var i;
// Since C(n, k) = C(n, n-k)
if (k > n - k)
k = n - k;
// Calculate value of
// [n * (n-1) *---* (n-k+1)] /
// [k * (k-1) *---* 1]
for (i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
} // Function to return the number of paths function countPaths(x1, y1, x2, y2)
{ // Difference between the 'x'
// coordinates of the given points
var m = Math.abs(x1 - x2);
// Difference between the 'y'
// coordinates of the given points
var n = Math.abs(y1 - y2);
return (binomialCoeff(m + n, n));
} // Driver code var x1 = 2, y1 = 3, x2 = 4, y2 = 5;
document.write(countPaths(x1, y1, x2, y2));
</script> |
6
Time complexity: O(k) where k=abs(y1 – y2)
Auxiliary space: O(1)