Given a two-dimensional matrix, in how way can someone traverse it from top-left to bottom-right?
Condition- At any particular cell the possible moves are either down or right, no other steps possible.
Stop when the end is reached.

Examples:
Input : 3 3
Output : 6
Input : 5 5
Output : 70
If we look closely, we will find that the number of ways a cell can be reached is = Number of ways it can reach the cell above it + number of ways it can reach the cell which is left of it.
So, start filling the 2D array according to it and return the last cell after completely filling the array.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int countPaths( int m, int n)
{
if (m == 1 || n == 1)
return 1;
return countPaths(m - 1, n) +
countPaths(m, n - 1);
}
int main()
{
int n = 5;
int m = 5;
cout << countPaths(n, m);
return 0;
}
|
Java
import java.lang.*;
import java.util.*;
class GFG
{
public int countPaths( int m, int n)
{
if (m == 1 || n == 1 )
return 1 ;
return countPaths(m - 1 , n) +
countPaths(m, n - 1 );
}
public static void main(String args[])
{
GFG g = new GFG();
int n = 5 , m = 5 ;
System.out.println(g.countPaths(n, m));
}
}
|
Python3
def countPaths(m, n) :
if m = = 1 or n = = 1 :
return 1
return (countPaths(m - 1 , n) +
countPaths(m, n - 1 ))
if __name__ = = "__main__" :
n = 5
m = 5
print (countPaths(n, m))
|
C#
using System;
class GFG
{
public int countPaths( int m, int n)
{
if (m == 1 || n == 1)
return 1;
return countPaths(m - 1, n) +
countPaths(m, n - 1);
}
public static void Main()
{
GFG g = new GFG();
int n = 5, m = 5;
Console.WriteLine(g.countPaths(n, m));
Console.Read();
}
}
|
PHP
<?php
function countPaths( $m , $n )
{
if ( $m == 1 || $n == 1)
return 1;
return countPaths( $m - 1, $n ) +
countPaths( $m , $n - 1);
}
$n = 5;
$m = 5;
echo countPaths( $n , $m );
?>
|
Javascript
<script>
function countPaths(m, n)
{
if (m == 1 || n == 1)
return 1;
return countPaths(m - 1, n) +
countPaths(m, n - 1);
}
let n = 5, m = 5;
document.write(countPaths(n, m));
</script>
|
The above solution has exponential time complexity. It can be optimized using Dynamic Programming as there are overlapping subproblems (highlighted below in partial recursion tree for m=3, n=3)
Space Complexity: 2(m+n)
CP(3, 3)
/ \
CP(2, 3) CP(3, 2)
/ \ / \
CP(1,3) CP(2,2) CP(2,2) CP(3,1)
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int countPaths( int m, int n)
{
int dp[m+1][n+1];
for ( int i=1; i<=m; i++)
{
for ( int j=1; j<=n; j++)
{
if (i==1 || j == 1)
dp[i][j] = 1;
else
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m][n];
}
int main()
{
int n = 5;
int m = 5;
cout << countPaths(n, m);
return 0;
}
|
Java
class GFG
{
static int countPaths( int m, int n)
{
int [][]dp= new int [m+ 1 ][n+ 1 ];
for ( int i= 1 ; i<=m; i++)
{
for ( int j= 1 ; j<=n; j++)
{
if (i== 1 || j == 1 )
dp[i][j] = 1 ;
else
dp[i][j] = dp[i- 1 ][j] + dp[i][j- 1 ];
}
}
return dp[m][n];
}
public static void main(String []args)
{
int n = 5 ;
int m = 5 ;
System.out.println(countPaths(n, m));
}
}
|
Python3
def countPaths(m, n):
dp = [[ 0 for i in range (m + 1 )]
for j in range (n + 1 )]
for i in range ( 1 , m + 1 ):
for j in range ( 1 , n + 1 ):
if (i = = 1 or j = = 1 ):
dp[i][j] = 1
else :
dp[i][j] = (dp[i - 1 ][j] +
dp[i][j - 1 ])
return dp[m][n]
if __name__ = = "__main__" :
n = 5
m = 5
print (countPaths(n, m))
|
C#
using System;
class GFG
{
static int countPaths( int m, int n)
{
int [,]dp= new int [m+1,n+1];
for ( int i=1; i<=m; i++)
{
for ( int j=1; j<=n; j++)
{
if (i==1 || j == 1)
dp[i,j] = 1;
else
dp[i,j] = dp[i-1,j] + dp[i,j-1];
}
}
return dp[m,n];
}
public static void Main()
{
int n = 5;
int m = 5;
Console.WriteLine(countPaths(n, m));
}
}
|
PHP
<?php
function countPaths( $m , $n )
{
$dp ;
for ( $i = 1; $i <= $m ; $i ++)
{
for ( $j = 1; $j <= $n ; $j ++)
{
if ( $i == 1 || $j == 1)
$dp [ $i ][ $j ] = 1;
else
$dp [ $i ][ $j ] = $dp [ $i - 1][ $j ] +
$dp [ $i ][ $j - 1];
}
}
return $dp [ $m ][ $n ];
}
$n = 5;
$m = 5;
echo countPaths( $n , $m );
?>
|
Javascript
<script>
function countPaths(m, n)
{
let dp = new Array(m+1);
for (let i=0; i<=m; i++)
{
dp[i] = new Array(n + 1);
for (let j=0; j<=n; j++)
{
dp[i][j] = 0;
}
}
for (let i=1; i<=m; i++)
{
for (let j=1; j<=n; j++)
{
if (i==1 || j == 1)
dp[i][j] = 1;
else
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m][n];
}
let n = 5;
let m = 5;
document.write(countPaths(n, m));
</script>
|
Time Complexity: O(m * n)
Auxiliary Space: O(m * n)
Another Method(Efficient):
There is one more efficient way of reaching the solution in O(m) or O(n) whichever is greater.
We can permute the number of right operations and down operations.
Explanation:
In the given figure, we can see that for a matrix of 3×3, we need 2 right operations and 2 down operations.
Thus, we can permute these operations in any order, still we can reach the bottom-right.
“RRDD”,”RDRD”,”RDDR”,”DRDR”,”DDRR”,”DRRD”
Let the number of columns be m, and the number of rows is n, then no of permutations = (m+n)!/ (m!*n!)
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
int factorial( int n)
{
int res = 1, i;
for (i = 2; i <= n; i++)
res *= i;
return res;
}
int countWays( int m, int n)
{
m = m - 1;
n = n - 1;
return factorial(m + n) /
(factorial(m) *
factorial(n));
}
int main()
{
int m = 5;
int n = 5;
int result = countWays(m, n);
cout << result;
}
|
Java
import java.io.*;
class GFG {
static int factorial( int n)
{
int res = 1 , i;
for (i = 2 ; i <= n; i++)
res *= i;
return res;
}
static int countWays( int m, int n)
{
m = m - 1 ;
n = n - 1 ;
return factorial(m + n)
/ (factorial(m) * factorial(n));
}
public static void main(String[] args)
{
int m = 5 ;
int n = 5 ;
int result = countWays(m, n);
System.out.println(result);
}
}
|
Python3
def factorial(n):
res = 1
for i in range ( 2 , n + 1 ):
res * = i
return res
def countWays(m, n):
m = m - 1
n = n - 1
return (factorial(m + n) / /
(factorial(m) *
factorial(n)))
m = 5
n = 5
result = countWays(m, n)
print (result)
|
C#
using System;
class GFG{
static int factorial( int n)
{
int res = 1, i;
for (i = 2; i <= n; i++)
res *= i;
return res;
}
static int countWays( int m, int n)
{
m = m - 1;
n = n - 1;
return factorial(m + n) /
(factorial(m) * factorial(n));
}
static void Main()
{
int m = 5;
int n = 5;
int result = countWays(m, n);
Console.WriteLine(result);
}
}
|
Javascript
<script>
function factorial( n)
{
var res = 1, i;
for (i = 2; i <= n; i++)
res *= i;
return res;
}
function countWays( m, n)
{
m = m - 1;
n = n - 1;
return factorial(m + n) /
(factorial(m) * factorial(n));
}
var m = 5;
var n = 5;
var result = countWays(m, n);
document.write(result);
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)