【AT2142】Building Cubes with AtCoDeer

链接:AT2142(又是日文题面)

解法:暴力!!!

没错,就是暴力!!!
枚举两个相对的面,就可以确定八个角的颜色,于是确定整个正方体。
暴力枚举这两个面,用map统计答案。注意将每个面的四种旋转情况全部加入到map中。

代码
#include<iostream>
#include<cstdio>
#include<map>

using namespace std;

struct cube{
    int a,b,c,d;
    cube():a(0),b(0),c(0),d(0){}
    cube(int m,int n,int p,int q):a(m),b(n),c(p),d(q){}
    friend bool operator<(const cube &cb1,const cube &cb2){if(cb1.a!=cb2.a)return cb1.a<cb2.a;if(cb1.b!=cb2.b)return cb1.b<cb2.b;if(cb1.c!=cb2.c)return cb1.c<cb2.c;return cb1.d<cb2.d;}
    void rotate(){int t=a;a=b,b=c,c=d,d=t;}
};

class FastFileReader{char buffer[10000001];char *h;int len;inline char gchar(){return *h++;}inline bool validdigit(char c){return c>='0' && c<='9';}public:inline void init(){len=fread(buffer,1,10000000,stdin);h=buffer;}inline int nextint(){register int i=0;register char c;do c=gchar();while(!validdigit(c));do{i=i*10+c-48;c=gchar();}while(validdigit(c));return i;}inline int nextsigned(){register int i=0,f=1;register char c;do{c=gchar();if(c=='-')f=-1;}while(!validdigit(c));do{i=i*10+c-48;c=gchar();}while(validdigit(c));return i*f;}inline long long nextlonglong(){register long long i=0;register char c;do c=gchar();while(!validdigit(c));do{i=i*10+c-48;c=gchar();}while(validdigit(c));return i;}inline long long nextsignedlonglong(){register long long i=0,f=1;register char c;do{c=gchar();if(c=='-')f=-1;}while(!validdigit(c));do{i=i*10+c-48;c=gchar();}while(validdigit(c));return i*f;}inline char nextchar(){register char c;do c=gchar();while(c<=' ');return c;}};

FastFileReader fs;
map<cube,int> m;
int n;
long long ans;
cube c[401];

void insert(cube c,int x){for(int i=1;i<=4;++i)m[c]+=x,c.rotate();}

int main(){
    fs.init();n=fs.nextint();for(int i=1;i<=n;++i)c[i].a=fs.nextint(),c[i].b=fs.nextint(),c[i].c=fs.nextint(),c[i].d=fs.nextint(),insert(c[i],1);
    for(int i=1;i<=n;++i){
        insert(c[i],-1);
        for(int j=i+1;j<=n;++j){
            insert(c[j],-1);
            for(int k=0;k<4;++k){
                c[j].rotate();
                cube c1(c[i].b,c[i].a,c[j].a,c[j].d),c2(c[i].c,c[i].b,c[j].d,c[j].c),c3(c[i].d,c[i].c,c[j].c,c[j].b),c4(c[i].a,c[i].d,c[j].b,c[j].a);
                if(m.count(c1)&&m.count(c2)&&m.count(c3)&&m.count(c4)){long long sum=1ll;sum*=m[c1],insert(c1,-1),sum*=m[c2],insert(c2,-1),sum*=m[c3],insert(c3,-1),ans+=sum*m[c4],insert(c1,1),insert(c2,1),insert(c3,1);}
            }
            insert(c[j],1);
        }
    }
    printf("%lld",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Marching Cubes算法是一种常用的三维体数据表面重建算法。它可以将一个体数据集转化为连续的多边形网格模型。 在三维体数据中,每个体素的值表示其在某一属性上的特征,如密度、压力等。Marching Cubes算法首先将整个体数据集划分为无数个小立方体,每个小立方体包含8个顶点。然后根据每个小立方体顶点所代表的属性值与事先设定的阈值进行比较,确定该顶点是否在表面上。若在表面上,就将相应顶点连接起来组成一个面,并将该面连接到整个网格模型上。 得到的多边形网格模型可以用于可视化、仿真和分析等应用。Marching Cubes算法具有简单、高效的特点,适用于各种不规则的三维体数据集。它广泛应用于医学图像处理、地质勘探、计算机动画等领域。 然而,Marching Cubes算法也存在一些限制。首先,它在重建过程中产生的多边形可能存在不连续性和拓扑错误。为了解决这个问题,后续研究提出了一些改进算法,如Dual Marching Cubes和Extended Marching Cubes。其次,Marching Cubes算法对数据集的分辨率要求较高,对于过于细致的结构可能无法很好地重建。 总的来说,Marching Cubes算法在三维体数据表面重建领域具有重要的应用价值,其简单、高效的特点使其成为一种常用的算法。随着相关技术的不断发展,对Marching Cubes算法的改进和优化将进一步推动其在各个领域的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值