House Building HDU
阿新 • • 發佈:2018-12-09
題目連線
題意
本題以風靡全球的遊戲MineCraft為背景,其實質是求一個立體不規則物體的表面積,輸入一個n*m的矩陣mat[][],mat[i][j]代表建築第i行第j列的高度,計算出這個矩陣不規則物體的表面積(除底面外)。
思路
一拿到手並沒有太好的思路,因為物體不規則,情況多樣,比較複雜,然而因為每個方塊都是疊上去的,所以並不會出現一個方塊下方是空的狀況(雖然遊戲中可以實現),弄清楚這個,接下來我們就可以分別求上表面積和側面積了:
上表面積很簡單,當(i,j)處高度不為0時,ans++;
側面積其實也不是很難求,如果兩根柱子緊挨在一起,它們重疊的部分已經不是表面了,所以只要計算相對高的那根柱子露在外面的部分,我們假設矩陣周圍包了一圈的0高度的柱子,這樣子更方便計算。具體做法便是從頭遍歷每一跟柱子,計算它下側和右側的表面積,求和即可。
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int mat[55][55];
int main()
{
int T,n,m,i,j;
cin>>T;
while(T--)
{
memset(mat,0,sizeof(mat));
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin >>mat[i][j];
int ans=0;
for(i=0;i<=n;i++)//i,j從0到n,假設外面有一圈0
for(j=0;j<=m;j++)
{
if(mat[i][j])
ans++;//計算上表面積
ans+=abs(mat[i][j]-mat[i+1][j]);//計算下側
ans+=abs(mat[i][j]-mat[i][j+1]);//計算右側
}
cout <<ans<<endl;
}
return 0;
}