📜  查找 3D 图形的表面积

📅  最后修改于: 2021-10-23 08:24:20             🧑  作者: Mango

给定一个 N*M 矩阵 A[][] 表示一个 3D 图形。建筑物的高度在(i, j)  A[i][j]  .求图形的表面积。
例子 :

Input : N = 1, M = 1   A[][] = { {1} }
Output : 6

Explanation : 
The total surface area is 6 i.e 6 side of 
the figure and each are of height 1.

Input : N = 3, M = 3   A[][] = { {1, 3, 4},
                                 {2, 2, 3},
                                 {1, 2, 4} }
Output : 60

方法:要找到表面积,我们需要考虑给定 3D 图形的所有六个边的贡献。我们将部分解决问题以使其变得容易。图形的底部将始终为图形的总表面积贡献 N*M,而图形的顶部将贡献相同的 N*M 面积。现在,为了计算墙贡献的面积,我们将取出相邻两墙高度之间的绝对差。差异将是总表面积的贡献。
下面是上述想法的实现:

C++
// CPP program to find the Surface area of a 3D figure
#include 
using namespace std;
 
// Declaring the size of the matrix
const int M = 3;
const int N = 3;
 
// Absolute Difference between the height of
// two consecutive blocks
int contribution_height(int current, int previous)
{
    return abs(current - previous);
}
 
// Function To calculate the Total surfaceArea.
int surfaceArea(int A[N][M])
{
    int ans = 0;
 
    // Traversing the matrix.
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
 
            /* If we are traveling the topmost row in the
            matrix, we declare the wall above it as 0
            as there is no wall above it. */
            int up = 0;
 
            /* If we are traveling the leftmost column in the
            matrix, we declare the wall left to it as 0
            as there is no wall left it. */
            int left = 0;
 
            // If its not the topmost row
            if (i > 0)
                up = A[i - 1][j];
 
            // If its not the leftmost column
            if (j > 0)
                left = A[i][j - 1];
 
            // Summing up the contribution of by
            // the current block
            ans += contribution_height(A[i][j], up)
                    + contribution_height(A[i][j], left);
 
            /* If its the rightmost block of the matrix
               it will contribute area equal to its height
               as a wall on the right of the figure */
            if (i == N - 1)
                ans += A[i][j];
 
            /* If its the lowest block of the matrix it will
               contribute area equal to its height as a wall
               on the bottom of the figure */
            if (j == M - 1)
                ans += A[i][j];
        }
    }
 
    // Adding the contribution by the base and top of the figure
    ans += N * M * 2;
    return ans;
}
 
// Driver program
int main()
{
    int A[N][M] = { { 1, 3, 4 },
                    { 2, 2, 3 },
                    { 1, 2, 4 } };
    cout << surfaceArea(A) << endl;
    return 0;
}


Java
// Java program to find the Surface
// area of a 3D figure
 
class GFG
{
    // Declaring the size of the matrix
    static final int M=3;
    static final int N=3;
     
    // Absolute Difference between the height of
    // two consecutive blocks
    static int contribution_height(int current, int previous)
    {
        return Math.abs(current - previous);
    }
     
    // Function To calculate the Total surfaceArea.
    static int surfaceArea(int A[][])
    {
        int ans = 0;
     
        // Traversing the matrix.
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++) {
     
                /* If we are traveling the topmost
                row in the matrix, we declare the
                wall above it as 0 as there is no
                wall above it. */
                int up = 0;
     
                /* If we are traveling the leftmost
                column in the matrix, we declare the
                wall left to it as 0as there is no
                wall left it. */
                int left = 0;
     
                // If its not the topmost row
                if (i > 0)
                    up = A[i - 1][j];
     
                // If its not the leftmost column
                if (j > 0)
                    left = A[i][j - 1];
     
                // Summing up the contribution of by
                // the current block
                ans += contribution_height(A[i][j], up)
                       + contribution_height(A[i][j], left);
     
                /* If its the rightmost block of the matrix
                it will contribute area equal to its height
                as a wall on the right of the figure */
                if (i == N - 1)
                    ans += A[i][j];
     
                /* If its the lowest block of the
                matrix it will contribute area equal
                to its height as a wall on
                 the bottom of the figure */
                if (j == M - 1)
                    ans += A[i][j];
            }
        }
     
        // Adding the contribution by
        // the base and top of the figure
        ans += N * M * 2;
        return ans;
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int A[][] = {{ 1, 3, 4 },
                     { 2, 2, 3 },
                     { 1, 2, 4 } };
        System.out.println(surfaceArea(A));
    }
}
 
// This code is contributed By Anant Agarwal.


Python3
# Python3 program to find the
# Surface area of a 3D figure
 
 
# Declaring the size
# of the matrix
M = 3;
N = 3;
 
# Absolute Difference
# between the height of
# two consecutive blocks
def contribution_height(current, previous):
    return abs(current - previous);
 
# Function To calculate
# the Total surfaceArea.
def surfaceArea(A):
    ans = 0;
 
    # Traversing the matrix.
    for i in range(N):
        for j in range(M):
 
            # If we are traveling the
            # topmost row in the matrix,
            # we declare the wall above it
            # as 0 as there is no wall
            # above it.
            up = 0;
 
            # If we are traveling the
            # leftmost column in the
            # matrix, we declare the wall
            # left to it as 0 as there is
            # no wall left it.
            left = 0;
 
            # If its not the topmost row
            if (i > 0):
                up = A[i - 1][j];
 
            # If its not the
            # leftmost column
            if (j > 0):
                left = A[i][j - 1];
 
            # Summing up the
            # contribution of by
            # the current block
            ans += contribution_height(A[i][j], up)+contribution_height(A[i][j], left);
             
            # If its the rightmost block
            # of the matrix it will contribute
            # area equal to its height as a
            # wall on the right of the figure */
            if (i == N - 1):
                ans += A[i][j];
 
            # If its the lowest block
            # of the matrix it will
            # contribute area equal to
            # its height as a wall on
            # the bottom of the figure
            if (j == M - 1):
                ans += A[i][j];
 
    # Adding the contribution by
    # the base and top of the figure
    ans += N * M * 2;
    return ans;
 
# Driver Code
A = [[1, 3, 4],[2, 2, 3],[1, 2, 4]];
print(surfaceArea(A));
 
# This code is contributed By mits


C#
// C# program to find the
// Surface area of a 3D figure
using System;
 
class GFG
{
    // Declaring the size of the matrix
    static int M=3;
    static int N=3;
     
    // Absolute Difference between the
    // height of two consecutive blocks
    static int contribution_height(int current, int previous)
    {
        return Math.Abs(current - previous);
    }
     
    // Function To calculate the
    // Total surfaceArea.
    static int surfaceArea(int [,]A)
    {
        int ans = 0;
     
    // Traversing the matrix.
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++) {
     
    // If we are traveling the topmost
    // row in the matrix, we declare the
    // wall above it as 0 as there is no
    // wall above it.
                int up = 0;
     
    // If we are traveling the leftmost
    // column in the matrix, we declare
    // the wall left to it as 0as there
    // is no wall left it.
                int left = 0;
     
    // If its not the topmost row
                if (i > 0)
                    up = A[i - 1,j];
     
    // If its not the leftmost column
                if (j > 0)
                    left = A[i,j - 1];
     
    // Summing up the contribution 
    // of by the current block
            ans += contribution_height(A[i,j], up)
                + contribution_height(A[i,j], left);
     
    // If its the rightmost block of the
    // matrix it will contribute area equal
    // to its height as a wall on the right
    // of the figure
                if (i == N - 1)
                    ans += A[i,j];
     
    // If its the lowest block of the
    // matrix it will contribute area 
    // equal to its height as a wall
    // on the bottom of the figure
                if (j == M - 1)
                    ans += A[i,j];
            }
        }
     
    // Adding the contribution by the
    // base and top of the figure
        ans += N * M * 2;
        return ans;
    }
     
    // Driver code
    public static void Main ()
    {
        int [,]A = {{ 1, 3, 4 },
                    { 2, 2, 3 },
                    { 1, 2, 4 } };
        Console.WriteLine(surfaceArea(A));
    }
}
 
// This code is contributed By vt_m.


PHP
 0)
                $up = $A[$i - 1][$j];
 
            // If its not the
            // leftmost column
            if ($j > 0)
                $left = $A[$i][$j - 1];
 
            // Summing up the
            // contribution of by
            // the current block
            $ans += contribution_height($A[$i][$j], $up) +
                    contribution_height($A[$i][$j], $left);
             
            /* If its the rightmost block
            of the matrix it will contribute
            area equal to its height as a
            wall on the right of the figure */
            if ($i == $N - 1)
                $ans += $A[$i][$j];
 
            /* If its the lowest block
               of the matrix it will
               contribute area equal to
               its height as a wall on
               the bottom of the figure */
            if ($j == $M - 1)
                $ans += $A[$i][$j];
        }
    }
 
    // Adding the contribution by
    // the base and top of the figure
    $ans += $N * $M * 2;
    return $ans;
}
 
// Driver Code
$A = array(array(1, 3, 4),
           array(2, 2, 3),
           array(1, 2, 4));
echo surfaceArea($A);
 
// This code is contributed By mits
?>


Javascript


输出 :

60