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