码迷,mamicode.com
首页 > 其他好文 > 详细

COJ 1697:模拟

时间:2016-03-14 20:14:04      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:

题意:给一个边长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;
}

 

COJ 1697:模拟

标签:

原文地址:http://www.cnblogs.com/luxiaoming/p/5276871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!