题意:给出一个n*m的矩阵,也是由1*1*1的小立方体组成的几何体的俯视图,求这个几何体的表面积(1 <= n, m <= 100)。
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=519
——>>原想分角、边、中间3部分求,不过写着写着即发现,自己想复杂啦,可以不分类,一起求。
对于矩阵中的每一个元素,求与其上、下、左、右的高度差,这个差值就是能看见的正侧面,求完后加上顶面的1个和底面的1个。最后求总和即是表面积。
测试时发现,输入不对头,才发现,矩阵元素之间没空格,就猜想矩阵元素的高度是个1位数,结果还真是!
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100 + 10;
int n, m, G[maxn][maxn];
int main()
{
int i, j, u, d, l, r;
char c;
while(scanf("%d%d", &n, &m) == 2){
memset(G, 0, sizeof(G));
for(i = 1; i <= n; i++){
getchar();
for(j = 1; j <= m; j++){
c = getchar();
G[i][j] = (int)(c - '0');
}
}
int ret = 0;
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++) if(G[i][j]){
u = G[i][j] - G[i-1][j];
d = G[i][j] - G[i+1][j];
l = G[i][j] - G[i][j-1];
r = G[i][j] - G[i][j+1];
if(u > 0) ret += u;
if(d > 0) ret += d;
if(l > 0) ret += l;
if(r > 0) ret += r;
ret += 2;
}
printf("%d\n", ret);
}
return 0;
}