1. 程式人生 > >House Building HDU

House Building HDU

題目連線

題意

本題以風靡全球的遊戲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; }