现搬运一位大神的解题思路,简单清晰:
C语言程序代码:
#define MIN_TWO(a, b) ( (a < b) ? a : b )
int surfaceArea(int** grid, int gridSize, int* gridColSize){
int cube = 0;//记录立方体的个数
int face = 0;//记录重叠接触面的个数
int i,j;
for(i = 0;i < gridSize;i++)
for(j = 0;j < *gridColSize;j++)
cube += grid[i][j];
/*
j0 j1
i0 (i0,j0) (i0,j1)
i1 (i1,j0) (i1,j1)
*/
for(i = 0;i < gridSize;i++)
for(j = 0;j < *gridColSize;j++)
{
if(grid[i][j] > 0)
face += grid[i][j]-1;
if(i > 0) //找到上边接触面个数
face += MIN_TWO(grid[i][j],grid[i-1][j]);
if(j > 0) //找到左边接触面个数
face += MIN_TWO(grid[i][j],grid[i][j-1]);
}
return cube*6 - face*2;
}