题意:给一个边长A B C的长方体,求取出N个1*1*1的正方体后所剩几何体的表面积(包括内部)
思路:取出正方体后对原几何体表面积的影响,取决于取这个正方体前,其与原几何体接触的面数
比如说该正方体取出前有4个面和原几何体有联系,那取出后表面积+2
这样可以看到面数为0 1 2 3 4 5 6,分别对应表面积变化-6 -4 -2 0 2 4 6
以此考虑就好
#include"cstdio" #include"queue" #include"iostream" using namespace std; const int N = 2005; struct node{ long long x,y,z; node(){} node(long long a,long long b,long long c):x(a),y(b),z(c){} }p[N]; int s[7]; int pre[N]; long long a,b,c,n; int get_(node t){ int ans=6; if(!t.x) ans--; if(!t.y) ans--; if(!t.z) ans--; if(t.x==a-1) ans--; if(t.y==b-1) ans--; if(t.z==c-1) ans--; return ans; } bool check(node a,node b){ if(a.x==b.x&&a.y==b.y&&(a.z-b.z==1||a.z-b.z==-1)) return true; if(a.x==b.x&&a.z==b.z&&(a.y-b.y==1||a.y-b.y==-1)) return true; if(a.z==b.z&&a.y==b.y&&(a.x-b.x==1||a.x-b.x==-1)) return true; return false; } int main(){ //freopen("in.txt","r",stdin); s[0]=-6; for(int i=1;i<=6;i++) s[i]=s[i-1]+2; while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&n)){ for(int i=0;i<n;i++){ long long x,y,z; scanf("%lld%lld%lld",&x,&y,&z); p[i]=node(x,y,z); } long long ans=(a*b+b*c+a*c)*2; for(int i=0;i<n;i++) pre[i]=get_(p[i]); for(int i=0;i<n;i++){ for(int j=0;j<i;j++) if(check(p[i],p[j])) pre[i]--; ans+=s[pre[i]]; } printf("%lld\n",ans); } return 0; }
时间: 2024-10-18 22:33:50