天天看點

Leetcode 892. 三維形體的表面積

該題目為求解三維形體的表面積,主要是求解過程很清晰,數學問題!

題目描述:

  在 N * N 的網格上,我們放置一些 1 * 1 * 1  的立方體。

  每個值 v = grid[i][j] 表示 v 個正方體疊放在對應單元格 (i, j) 上。

  請你傳回最終形體的表面積。

執行個體1

輸入:[[2]]
輸出:10      

執行個體2

輸入:[[1,2],[3,4]]
輸出:34

分析:
執行個體1可知,當隻有一摞立方體時,其表面積可以直接由長方體面積公式求得,S=grid[i][j]*4+2,四個側面積加上下底面積即可!
執行個體2:
  相鄰的兩個立方體會進行吸收,是以,相鄰的表面積應該是較高的部分,減去較低的部分的剩餘面積,我們需要進行分層計算。
  對于這個執行個體,分析如下:
   
  S橫:以行為機關,第一行和最後一行的面積直接相加,其餘相鄰部分由相鄰方塊的差的絕對值構成;
  S縱:以列為機關,第一列和最後一列的面積直接相加,其餘相鄰部分同樣由相鄰方塊差的絕對值構成;
  S底:隻要單元格内有方塊,就加上、下兩個底面積,S底+=2,(不管是幾個)
  總面積則等于三塊面積相加總和,代碼如下:
      
1 class Solution {
 2 public:
 3     int surfaceArea(vector<vector<int>>& grid) {
 4         if(grid.size()==1)
 5             return grid[0][0]*4+2;
 6         int N=grid.size();
 7         int count=0;
 8         //先計算橫向面積
 9         for(int i=0;i<N;i++)
10         {
11             for(int j=0;j<N;j++)
12             {
13                 if(i==0)  //首行相加
14                     count+=grid[i][j];
15                 else{
16                     count+=abs(grid[i][j]-grid[i-1][j]);  //其餘等于差的絕對值
17                 }
18                 if(i==N-1)  //尾行直接相加
19                     count+=grid[i][j];
20             }
21         }
22         //cout<<"hengxiang is "<<count<<endl;
23         //再計算縱向面積
24         for(int j=0;j<N;j++)
25         {
26             for(int i=0;i<N;i++)
27             {
28                 if(j==0)  //首列直接相加
29                     count+=grid[i][j];
30                 else{
31                     count+=abs(grid[i][j]-grid[i][j-1]);  //其餘等于差的絕對值
32                 }
33                 if(j==N-1)  //尾列直接相加
34                     count+=grid[i][j];
35             }
36         }
37         //計算上下面積
38         int sum=0;
39         for(int i=0;i<N;i++)
40         {
41             for(int j=0;j<N;j++)
42             {
43                 if(grid[i][j]>0)
44                     sum++;
45             }
46         }
47         //cout<<"sum is "<<sum<<endl;
48         count+=(sum*2);  //上下兩個底面積,加到結果上
49 
50         return count;
51     }
52 };      

簡單題而已,清晰的程式設計思路很重要~~~