航院5538:House Building

这里写图片描述
这里写图片描述
这里写图片描述

题意概括:此题为一道模拟题,根据题意进行模拟即可。

解题思路:
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;
}
posted @ 2017-10-12 10:59  moonlight987  阅读(91)  评论(0编辑  收藏  举报