给定一个 N*M 矩阵 A[][] 表示一个 3D 图形。建筑物的高度在是 .求图形的表面积。
例子 :
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