892.三维形体的表面积

  1. 892.三维形体的表面积
    1. 892.1 题目
    2. 892.2 题解
      1. 遍历计算表面积
    3. 892.3 代码
    4. 892.4 运行结果

892.三维形体的表面积


892.1 题目

给你一个 n * n 的网格 grid,上面放置着一些 1 x 1 x 1 的正方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。

放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。

请你返回最终这些形体的总表面积。

注意:每个形体的底面也需要计入表面积中。

示例 1:


输入:grid = [[1,2],[3,4]]
输出:34

示例 2:


输入:grid = [[1,1,1],[1,0,1],[1,1,1]]
输出:32

示例 3:


输入:grid = [[2,2,2],[2,1,2],[2,2,2]]
输出:46

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 50
  • 0 <= grid[i][j] <= 50

892.2 题解

遍历计算表面积

// 方法一:遍历计算表面积
// 遍历每个格子,使用表面积计算公式计算后,减去上左重叠的面积
static int SurfaceArea1(int[][] grid)
{
    // 获取网格的长度(假设网格是 n * n 的正方形)
    int gridLength = grid.Length;

    // 初始化表面积为 0
    int surfaceArea = 0;

    // 遍历每个单元格
    for (int nowX = 0; nowX < gridLength; nowX++)
    {
        for (int nowY = 0; nowY < gridLength; nowY++)
        {
            // 获取当前单元格的高度值
            int heightValue = grid[nowX][nowY];

            // 计算当前单元格的表面积
            if (heightValue > 0)
            {
                // 表面积计算公式:4 * 高度值 + 2(每个单元格的底面积为1,所以加2)
                surfaceArea += 4 * heightValue + 2;

                // 减去相邻重叠的部分 只考虑上和左即可 下和右上后面的单元格考虑上和左计算的
                // 如果当前单元格不在第一行,则减去与上方单元格的重叠面积。重叠面积是两者高度差乘2,因为重叠一次减少2表面积。
                if (nowX > 0) surfaceArea -= Math.Min(heightValue, grid[nowX - 1][nowY]) * 2;

                // 如果当前单元格不在第一列,则减去与左方单元格的重叠面积。重叠面积是两者高度差乘2,因为重叠一次减少2表面积。
                if (nowY > 0) surfaceArea -= Math.Min(heightValue, grid[nowX][nowY - 1]) * 2;
            }
        }
    }

    // 返回最终计算得到的表面积
    return surfaceArea;
}

892.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

        // 给定一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体。
        // 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
        // 放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。
        // 请你返回最终这些形体的总表面积。

        // 注意:每个形体的底面也需要计入表面积中。

        // 示例 1:
        // 输入:grid = [[1,2],[3,4]]
        // 输出:34

        // 示例 2:
        // 输入:grid = [[1,1,1],[1,0,1],[1,1,1]]
        // 输出:32

        // 示例 3:
        // 输入:grid = [[2,2,2],[2,1,2],[2,2,2]]
        // 输出:46

        #endregion

        #region 测试

        // 示例 1
        int[][] grid1 = { new int[] { 1, 2 }, new int[] { 3, 4 } };
        int result1_1 = SurfaceArea1(grid1);
        Console.WriteLine($"示例1 方法1 输出:{result1_1}");

        // 示例 2
        int[][] grid2 = { new int[] { 1, 1, 1 }, new int[] { 1, 0, 1 }, new int[] { 1, 1, 1 } };
        int result2_1 = SurfaceArea1(grid2);
        Console.WriteLine($"示例2 方法1 输出:{result2_1}");

        // 示例 3
        int[][] grid3 = { new int[] { 2, 2, 2 }, new int[] { 2, 1, 2 }, new int[] { 2, 2, 2 } };
        int result3_1 = SurfaceArea1(grid3);
        Console.WriteLine($"示例3 方法1 输出:{result3_1}");

        #endregion
    }

    #region 答案

    // 方法一:遍历计算表面积
    // 遍历每个格子,使用表面积计算公式计算后,减去上左重叠的面积
    static int SurfaceArea1(int[][] grid)
    {
        // 获取网格的长度(假设网格是 n * n 的正方形)
        int gridLength = grid.Length;

        // 初始化表面积为 0
        int surfaceArea = 0;

        // 遍历每个单元格
        for (int nowX = 0; nowX < gridLength; nowX++)
        {
            for (int nowY = 0; nowY < gridLength; nowY++)
            {
                // 获取当前单元格的高度值
                int heightValue = grid[nowX][nowY];

                // 计算当前单元格的表面积
                if (heightValue > 0)
                {
                    // 表面积计算公式:4 * 高度值 + 2(每个单元格的底面积为1,所以加2)
                    surfaceArea += 4 * heightValue + 2;

                    // 减去相邻重叠的部分 只考虑上和左即可 下和右上后面的单元格考虑上和左计算的
                    // 如果当前单元格不在第一行,则减去与上方单元格的重叠面积。重叠面积是两者高度差乘2,因为重叠一次减少2表面积。
                    if (nowX > 0) surfaceArea -= Math.Min(heightValue, grid[nowX - 1][nowY]) * 2;

                    // 如果当前单元格不在第一列,则减去与左方单元格的重叠面积。重叠面积是两者高度差乘2,因为重叠一次减少2表面积。
                    if (nowY > 0) surfaceArea -= Math.Min(heightValue, grid[nowX][nowY - 1]) * 2;
                }
            }
        }

        // 返回最终计算得到的表面积
        return surfaceArea;
    }

    #endregion
}

892.4 运行结果

示例1 方法1 输出:34
示例2 方法1 输出:32
示例3 方法1 输出:46


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏