House Building HDU - 5538
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
以上是关于House Building HDU - 5538的主要内容,如果未能解决你的问题,请参考以下文章
hdu 5538 House Building(长春现场赛——水题)