House Building HDU - 5538
题意:
有n * m的地方,每个地方都有不同高度的1 * 1的正方形块,相邻块紧密排列,问这些块的表面积是多少?
题解:
对于位置为(i,j)的一个高度为x的块,他的测表面积为4 * x,但是他会遮挡位置为(i-1,j)和(i,j-1)位置的块,被挡住的面积为更小高度者的二倍(因为两个块彼此紧靠,两者都损失这些面积),最后再加上顶面积
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=100;
int a[maxn][maxn];
int main()
{int t;t=read();while(t--){int sum=0;memset(a,0,sizeof(a));int n=read(),m=read();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){a[i][j]=read(); if(a[i][j])sum++;}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){sum+=a[i][j]*4;if(a[i-1][j])//前面 {sum-=min(a[i-1][j],a[i][j])*2;}if(a[i][j-1]){sum-=min(a[i][j-1],a[i][j])*2;}}} cout<<sum<<endl;}return 0;
}