题意概括:此题为一道模拟题,根据题意进行模拟即可。
解题思路:
1:此题求立体的表面积,只需算出每个面的表面积即可
2:表面积包括顶面和侧面
3:让每一个立方体与其前后左右的立方体的大小进行比较,多出来的部分需要计算其表面积。
错误原因:
1: 错误地将二重循环的初始条件从零开始。因为要比较前后左右四个立方体的表面积,因此应该从1开始,才能为之后的计算留下空间。
2: 只进行了判断,忘记了进行循环。因为要比较每一个立方体与其前后左右的大小,因此应当通过循环遍历这个二维数组,才能比较出每一个立方体与其前后左右的大小。
经验总结:
1: 边界问题:对于要与边界进行比较的二维数组,可将二维数组从1(而非0)开始遍历,这样就留下了空间使此二维数组可以与周围的边界进行比较。
2: 比较前可以通过memset对整个数组初始化,方便遍历。
3: 对于只要存在就需累加的情况,可以在输入时就进行累加。只需要在输入后进行if判断即可累加。
AC代码:
#include<stdio.h>
#include<string.h>
int main(void)
{
int e[55][55];
int T, n, m, sum, i, j;
scanf("%d", &T);
while(T--)
{
sum = 0;
memset(e, 0, sizeof(e));
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= m; j ++)
{
scanf("%d", &e[i][j]);
if(e[i][j])
{
sum++;
}
}
}
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= m; j ++)
{
if(e[i][j] > e[i-1][j])
{
sum += e[i][j] - e[i-1][j];
}
if(e[i][j] > e[i+1][j])
{
sum += e[i][j] - e[i+1][j];
}
if(e[i][j] > e[i][j-1])
{
sum += e[i][j] - e[i][j-1];
}
if(e[i][j] > e[i][j+1])
{
sum += e[i][j] - e[i][j+1];
}
}
}
printf("%d\n", sum);
}
return 0;
}