📜  计算使用“ 1 x 4”图块填充“ nx 4”网格的方式数量

📅  最后修改于: 2021-04-29 12:01:21             🧑  作者: Mango

给定数字n,计算使用1 x 4瓦片填充anx 4网格的方法数。
例子:

Input : n = 1
Output : 1

Input : n = 2
Output : 1
We can only place both tiles horizontally

Input : n = 3
Output : 1
We can only place all tiles horizontally.

Input : n = 4
Output : 2
The two ways are : 
  1) Place all tiles horizontally 
  2) Place all tiles vertically.

Input : n = 5
Output : 3
We can fill a 5 x 4 grid in following ways : 
  1) Place all 5 tiles horizontally
  2) Place first 4 vertically and 1 horizontally.
  3) Place first 1 horizontally and 4 horizontally.

我们强烈建议您单击此处并进行实践,然后再继续解决方案。

此问题主要是此拼贴问题的扩展
假设“ count(n)”是在“ nx 4”网格上放置图块的方法计数,当我们放置第一个图块时会出现以下两种情况。

  1. 水平放置第一个图块:如果我们水平放置第一个图块,问题将减少为“ count(n-1)”
  2. 垂直放置第一个图块:如果我们垂直放置第一个图块,则必须再垂直放置3个图块。因此问题减少到“ count(n-4)”

网格

因此,count(n)可以写成如下形式。

count(n) = 1 if n = 1 or n = 2 or n = 3   
   count(n) = 2 if n = 4
   count(n) = count(n-1) + count(n-4) 

这种重复类似于斐波纳契数,可以使用动态编程解决。

C++
// C++ program to count of ways to place 1 x 4 tiles
// on n x 4 grid.
#include
using namespace std;
 
// Returns count of count of ways to place 1 x 4 tiles
// on n x 4 grid.
int count(int n)
{
    // Create a table to store results of subproblems
    // dp[i] stores count of ways for i x 4 grid.
    int dp[n+1];
    dp[0] = 0;
 
    // Fill the table from d[1] to dp[n]
    for (int i=1; i<=n; i++)
    {
        // Base cases
        if (i >= 1 && i <= 3)
            dp[i] = 1;
        else if (i==4)
            dp[i] = 2 ;
 
        else
            // dp(i-1) : Place first tile horizontally
            // dp(n-4) : Place first tile vertically
            //         which means 3 more tiles have
            //         to be placed vertically.
            dp[i] = dp[i-1] + dp[i-4];
    }
 
    return dp[n];
}
 
// Driver program to test above
int main()
{
    int n = 5;
    cout << "Count of ways is " << count(n);
    return 0;
}


Java
// Java program to count of ways to place 1 x 4 tiles
// on n x 4 grid
import java.io.*;
 
class Grid
{
    // Function that count the number of ways to place 1 x 4 tiles
    // on n x 4 grid.
    static int count(int n)
    {
        // Create a table to store results of sub-problems
        // dp[i] stores count of ways for i x 4 grid.
        int[] dp = new int[n+1];
        dp[0] = 0;
        // Fill the table from d[1] to dp[n]
        for(int i=1;i<=n;i++)
        {
            // Base cases
            if (i >= 1 && i <= 3)
                dp[i] = 1;
            else if (i==4)
                dp[i] = 2 ;
 
            else
            {
                    // dp(i-1) : Place first tile horizontally
                    // dp(i-4) : Place first tile vertically
                    //         which means 3 more tiles have
                    //         to be placed vertically.
                    dp[i] = dp[i-1] + dp[i-4];
            }
        }
        return dp[n];
    }
     
    // Driver program
    public static void main (String[] args)
    {
        int n = 5;
        System.out.println("Count of ways is: " + count(n));
    }
}
 
// Contributed by Pramod Kumar


Python
# Python program to count of ways to place 1 x 4 tiles
# on n x 4 grid.
 
# Returns count of count of ways to place 1 x 4 tiles
# on n x 4 grid.
def count(n):
 
    # Create a table to store results of subproblems
    # dp[i] stores count of ways for i x 4 grid.
    dp = [0 for _ in range(n+1)]
 
    # Fill the table from d[1] to dp[n]
    for i in range(1,n+1):
 
        # Base cases
        if i <= 3:
            dp[i] = 1
        elif i == 4:
            dp[i] = 2
        else:
            # dp(i-1) : Place first tile horizontally
            # dp(n-4) : Place first tile vertically
            #           which means 3 more tiles have
            #           to be placed vertically.
            dp[i] = dp[i-1] + dp[i-4]
 
    return dp[n]
 
# Driver code to test above
n = 5
print ("Count of ways is"),
print (count(n))


C#
// C# program to count of ways
// to place 1 x 4 tiles on
// n x 4 grid
using System;
 
class GFG
{
     
    // Function that count the number
    // of ways to place 1 x 4 tiles
    // on n x 4 grid.
    static int count(int n)
    {
         
        // Create a table to store results
        // of sub-problems dp[i] stores
        // count of ways for i x 4 grid.
        int[] dp = new int[n + 1];
        dp[0] = 0;
         
        // Fill the table from d[1]
        // to dp[n]
        for(int i = 1; i <= n; i++)
        {
             
            // Base cases
            if (i >= 1 && i <= 3)
                dp[i] = 1;
            else if (i == 4)
                dp[i] = 2 ;
 
            else
            {
                 
                // dp(i-1) : Place first tile
                // horizontally dp(i-4) :
                // Place first tile vertically
                // which means 3 more tiles have
                // to be placed vertically.
                dp[i] = dp[i - 1] +
                        dp[i - 4];
            }
        }
        return dp[n];
    }
     
    // Driver Code
    public static void Main ()
    {
        int n = 5;
        Console.WriteLine("Count of ways is: "
                           + count(n));
    }
}
 
// This code is contributed by Sam007


PHP
= 1 && $i <= 3)
            $dp[$i] = 1;
        else if ($i == 4)
            $dp[$i] = 2 ;
 
        else
            // dp(i-1) : Place first tile horizontally
            // dp(n-4) : Place first tile vertically
            //             which means 3 more tiles have
            //             to be placed vertically.
            $dp[$i] = $dp[$i - 1] + $dp[$i - 4];
    }
 
    return $dp[$n];
}
 
    // Driver Code
    $n = 5;
    echo "Count of ways is " , countt($n);
 
// This code is contributed by nitin mittal.
?>


Javascript


输出 :

Count of ways is 3