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