【AT2142】Building Cubes with AtCoDeer

本文介绍了一种通过暴力枚举和地图统计解决正方体颜色匹配问题的方法。通过对两个相对面的颜色进行枚举,可以确定整个正方体的八个角的颜色,进而确定正方体的状态。使用C++代码实现,考虑到面的四种旋转情况,并在地图中统计答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接: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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值