天天看點

[題記]三維形體的表面積-leetcode

題目:三維形體的表面積

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

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

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

示例 1:

輸入:[[2]]

輸出:10

示例 2:

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

輸出:34

示例 3:

輸入:[[1,0],[0,2]]

輸出:16

示例 4:

輸入:[[1,1,1],[1,0,1],[1,1,1]]

輸出:32

示例 5:

輸入:[[2,2,2],[2,1,2],[2,2,2]]

輸出:46

提示:

1 <= N <= 50

0 <= grid[i][j] <= 50

思路:

  [暴力]

  我們可以求每個正方體的表面積,然後加起來即可。

  如:grid[0][1] = 3

  1. 他有一個頂部面積和底部面積為 top = 2
  2. 如果grid[0][1]在整個三維形體的左側,那麼它的左側面積為 grid[0][1];
  3. 如果grid[0][1]的右側grid[0][2]的高度比grid[0][1]小,那麼右側的面積為grid[0][1] - grid[0][2];
  4. 重複步驟2,3檢查其他方向。
  5. 重複以上步驟,最終得到每個位置上所貢獻出的頂面和底面積和側面積的和,則為三維形體的表面積。

上代碼(c):

//判斷這個位置是不是在三維形體的一側
bool check( int x, int y, int xlen, int ylen ) {
    if( x < 0|| x >= xlen|| y < 0|| y >= ylen ) return true;
    else return false;
}

int surfaceArea(int** grid, int gridSize, int* gridColSize){
    int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
    int top = 0;
    int side = 0;

    for( int i = 0; i < gridSize; i++ ) {
        for( int j = 0; j < *gridColSize; j++ ) {
            //底面積+頂面積
            if( grid[i][j] != 0 ) top+=2;

            for( int z = 0; z < 4; z++ ) {

                int x = i + dir[z][0];
                int y = j + dir[z][1];

                //如果在三維形體的一側
                if( check(x,y,gridSize,*gridColSize ) ){
                    side += grid[i][j];
                }
                else {
                    //如果不在三維形體的一側,檢查相鄰位置的高度關系
                    if( grid[x][y] >= grid[i][j] ) continue;
                    else ce += grid[i][j] - grid[x][y];
                }
            }
        }
    }
    return side+top;
}      

2020-03-25-09:45:22