題目:三維形體的表面積
在 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/40813.html
標籤:C
下一篇:[題記]序列計數-藍橋杯
