hdu5538-暴力-L

来源:互联网 发布:什么是aop面向切面编程 编辑:程序博客网 时间:2024/05/21 00:56

http://acm.hdu.edu.cn/showproblem.php?pid=5538
求不带底的表面积

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;const int maxn=55;int fx[2][4]={{1,-1,0,0},{0,0,1,-1}};int a[maxn][maxn];int main(){   ios::sync_with_stdio(false);    int t;    int m,n;    cin>>t;    while(t--){         memset(a,0,sizeof(a));         cin>>m>>n;         for(int i=1;i<=m;i++){            for(int j=1;j<=n;j++)                cin>>a[i][j];         }         int ans=0;         for(int i=1;i<=m;i++){            for(int j=1;j<=n;j++){                if(a[i][j]) {ans++;//一摞只有一个顶,                 ans+=a[i][j]*4;//四周                for(int k=0;k<4;k++){                    ans-=min(a[i][j],a[i+fx[0][k]][j+fx[1][k]]);                }                }            }         }         cout<<ans<<endl;    }    return 0;}

或者,来一个详细版本的。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>#include <math.h>#include <iostream>using namespace std;int a[55][55];long long solve(int n,int m){    long long ans=0;        for(int i=1;i<=n;i++)            for(int j=1;j<=m;j++)        {            if(a[i][j]>0&&a[i-1][j]>0)ans+=min(a[i][j],a[i-1][j]);            if(a[i][j]>0&&a[i+1][j]>0)ans+=min(a[i][j],a[i+1][j]);            if(a[i][j]>0&&a[i][j-1]>0)ans+=min(a[i][j],a[i][j-1]);            if(a[i][j]>0&&a[i][j+1]>0)ans+=min(a[i][j],a[i][j+1]);        }        return ans;//算的遮蔽和}int main(){    int t;    int m,n;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        long long sum=0,gai=0,geshu=0;        int maxn=0;        memset(a,0,sizeof(a));        for(int i=1;i<=n;i++)            for(int j=1;j<=m;j++)        {            scanf("%d",&a[i][j]);            if(a[i][j]>maxn)maxn=a[i][j];            sum+=a[i][j];            if(a[i][j]!=0)            gai+=((a[i][j]-1)*2);//盖住的。            if(a[i][j]>0)geshu++;//用来减去底        }        sum*=6;//理论面积        sum-=gai;//减去上下盖住的        //cout<<" fangzhen "<<solve(n,m)<<"shangxia="<<gai<<"geshu="<<geshu<<endl;        sum-=solve(n,m);//减去两边遮盖的        sum-=geshu;//减去底        printf("%lld\n",sum);    }    return 0;}
原创粉丝点击