Given a 3 x n board, find the number of ways to fill it with 2 x 1 dominoes.
Example 1:
Following are all the 3 possible ways to fill up a 3 x 2 board.
Example 2:
Here is one possible way of filling a 3 x 8 board. You have to find all the possible ways to do so.
Examples :
Input : 2 Output : 3 Input : 8 Output : 153 Input : 12 Output : 2131
Defining Subproblems:
At any point while filling the board, there are three possible states that the last column can be in:
An = No. of ways to completely fill a 3 x n board. (We need to find this) Bn = No. of ways to fill a 3 x n board with top corner in last column not filled. Cn = No. of ways to fill a 3 x n board with bottom corner in last column not filled.
Note: The following states are impossible to reach:
Finding Recurrences
Note: Even though Bn and Cn are different states, they will be equal for same ‘n’. i.e Bn = Cn
Hence, we only need to calculate one of them.
Calculating An:
Calculating Bn:
The final Recursive Relations are:
Base Cases:
C++
// C++ program to find no. of ways// to fill a 3xn board with 2x1 dominoes.#include <iostream>using namespace std;int countWays(int n){ int A[n + 1], B[n + 1]; A[0] = 1, A[1] = 0, B[0] = 0, B[1] = 1; for (int i = 2; i <= n; i++) { A[i] = A[i - 2] + 2 * B[i - 1]; B[i] = A[i - 1] + B[i - 2]; } return A[n];}int main(){ int n = 8; cout << countWays(n); return 0;} |
Java
// Java program to find no. of ways// to fill a 3xn board with 2x1 dominoes.import java.io.*;class GFG { static int countWays(int n) { int []A = new int[n+1]; int []B = new int[n+1]; A[0] = 1; A[1] = 0; B[0] = 0; B[1] = 1; for (int i = 2; i <= n; i++) { A[i] = A[i - 2] + 2 * B[i - 1]; B[i] = A[i - 1] + B[i - 2]; } return A[n]; } // Driver code public static void main (String[] args) { int n = 8; System.out.println(countWays(n)); }}// This code is contributed by anuj_67. |
Python 3
# Python 3 program to find no. of ways# to fill a 3xn board with 2x1 dominoes.def countWays(n): A = [0] * (n + 1) B = [0] * (n + 1) A[0] = 1 A[1] = 0 B[0] = 0 B[1] = 1 for i in range(2, n+1): A[i] = A[i - 2] + 2 * B[i - 1] B[i] = A[i - 1] + B[i - 2] return A[n]n = 8print(countWays(n))# This code is contributed by Smitha |
C#
// C# program to find no. of ways// to fill a 3xn board with 2x1 dominoes.using System;class GFG { static int countWays(int n) { int []A = new int[n+1]; int []B = new int[n+1]; A[0] = 1; A[1] = 0; B[0] = 0; B[1] = 1; for (int i = 2; i <= n; i++) { A[i] = A[i - 2] + 2 * B[i - 1]; B[i] = A[i - 1] + B[i - 2]; } return A[n]; } // Driver code public static void Main () { int n = 8; Console.WriteLine(countWays(n)); }}// This code is contributed by anuj_67. |
Javascript
<script> // Javascript program to find no. of ways // to fill a 3xn board with 2x1 dominoes. function countWays(n) { let A = new Array(n+1); let B = new Array(n+1); A[0] = 1; A[1] = 0; B[0] = 0; B[1] = 1; for (let i = 2; i <= n; i++) { A[i] = A[i - 2] + 2 * B[i - 1]; B[i] = A[i - 1] + B[i - 2]; } return A[n]; } let n = 8; document.write(countWays(n)); // This code is contributed by rameshtravel07.</script> |
PHP
<?php// PHP program to find no. of ways// to fill a 3xn board with 2x1 dominoes.function countWays($n){ $A = array(); $B = array(); $A[0] = 1; $A[1] = 0; $B[0] = 0; $B[1] = 1; for ( $i = 2; $i <= $n; $i++) { $A[$i] = $A[$i - 2] + 2 * $B[$i - 1]; $B[$i] = $A[$i - 1] + $B[$i - 2]; } return $A[$n];}// Driver Code$n = 8;echo countWays($n);// This code is contributed by anuj_67.?> |
153
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

