查询考试精神状态
查看原帖
查询考试精神状态
352885
asdetycv1zzc楼主2023/10/31 17:30

展示一下我极为丑陋的代码:

#include <bits/stdc++.h>

using namespace std;

inline int read()
{
    int x = 0,f = 1;
    char c = getchar();
    while(c < '0' || c > '9')
    {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9')
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}

struct resol
{
    int a1,a2,a3,a4,a5;
};
bool exist[99999 + 5];
vector<resol> rules;
long long ans;
int resol1[1000005],cnt = 0;

inline bool is_exist(int a1,int a2,int a3, int a4,int a5)
{
    return exist[a1*10000 + a2*1000 + a3*100 + a4*10 + a5];
}

inline void set_exist(int a1,int a2,int a3, int a4,int a5)
{
    exist[a1*10000 + a2*1000 + a3*100 + a4*10 + a5] = true;
}

inline void add_resol1(int a1,int a2,int a3, int a4,int a5)
{
    cnt++;
    resol1[cnt] = a1*10000 + a2*1000 + a3*100 + a4*10 + a5;
}

inline int get_resol(int a1,int a2,int a3, int a4,int a5)
{
    return a1*10000 + a2*1000 + a3*100 + a4*10 + a5;
}

int judge2(int t1, int t2)
{
    string r1 = to_string(t1);
    string r2 = to_string(t2);
    while(r1.size() < 5) r1 = '0' + r1;
    while(r2.size() < 5) r2 = '0' + r2;
    int diff = (r1[0] != r2[0]) + (r1[1] != r2[1]) + (r1[2] != r2[2]) + (r1[3] != r2[3]) + (r1[4] != r2[4]);
    return diff;
}

bool is_valid2(const int temp)
{
    vector<int> temp_rules;
    for(auto rule : rules)
    {
        temp_rules.emplace_back(get_resol(rule.a1,rule.a2,rule.a3,rule.a4,rule.a5));
    }

    for(auto rule : temp_rules)
    {
        int temp_copy = temp;
        if(temp_copy == rule) return false;
        int result = judge2(temp_copy,rule);
        if(result > 2) return false;
        if(result == 2)
        {
            while(temp_copy % 10 == rule % 10)
            {
                temp_copy /= 10;
                rule /= 10;
            }
            int diff_t1 = temp_copy % 10,diff_r1 = rule % 10;
            temp_copy /= 10;
            rule /= 10;
            while(temp_copy % 10 == rule % 10)
            {
                temp_copy /= 10;
                rule /= 10;
            }
            int diff_t2 = temp_copy % 10,diff_r2 = rule % 10;
            int diff1 = diff_t1 - diff_r1;
            int diff2 = diff_t2 - diff_r2;
            while(diff1 < 0) diff1 += 10;
            while(diff2 < 0) diff2 += 10;
            if((diff_t2 - diff_r2) != (diff_t1 - diff_r1))
            {
                return false;
            }
        }
    }
    
    return true;
}

int um1[100005],um2[100005];

void solve1(int n)
{
    for(auto rule : rules)
    {
        for(int digit = 0;digit <= 4;digit++)
        {
            switch(digit + 1)
            {
                case 1:
                {
                    for(int dyn = 0;dyn <= 9;dyn++)
                    {
                        if(dyn == rule.a1) continue;
                        int temp = get_resol(dyn,rule.a2,rule.a3,rule.a4,rule.a5);
                        um1[temp]++;
                    }
                    break;
                }
                case 2:
                {
                    for(int dyn = 0;dyn <= 9;dyn++)
                    {
                        if(dyn == rule.a2) continue;
                        int temp = get_resol(rule.a1,dyn,rule.a3,rule.a4,rule.a5);
                        um1[temp]++;
                    }
                    break;
                }
                case 3:
                {
                    for(int dyn = 0;dyn <= 9;dyn++)
                    {
                        if(dyn == rule.a3) continue;
                        int temp = get_resol(rule.a1,rule.a2,dyn,rule.a4,rule.a5);
                        um1[temp]++;
                    }
                    break;
                }
                case 4:
                {
                    for(int dyn = 0;dyn <= 9;dyn++)
                    {
                        if(dyn == rule.a4) continue;
                        int temp = get_resol(rule.a1,rule.a2,rule.a3,dyn,rule.a5);
                        um1[temp]++;
                    }
                    break;
                }
                case 5:
                {
                    for(int dyn = 0;dyn <= 9;dyn++)
                    {
                        if(dyn == rule.a5) continue;
                        int temp = get_resol(rule.a1,rule.a2,rule.a3,rule.a4,dyn);
                        um1[temp]++;
                    }
                    break;
                }
            }
        }
    }
    for(int i = 0;i <= 99999;i++)
    {
        if(um1[i] == n)
        {
            if(!exist[i])
            {
                ans++;
                exist[i] = true;
            }
        }
    }
    return;
}

void solve2(int n)
{
    for(auto rule : rules)
    {
        for(int digit = 0;digit <= 3;digit++)
        {
            switch(digit + 1)
            {
                case 1:
                {
                    for(int dyn = 1;dyn <= 9;dyn++)
                    {
                        int temp = get_resol((rule.a1 + dyn) % 10,(rule.a2 + dyn) % 10,rule.a3,rule.a4,rule.a5);
                        um2[temp]++;
                    }
                    break;
                }
                case 2:
                {
                    for(int dyn = 1;dyn <= 9;dyn++)
                    {
                        int temp = get_resol(rule.a1,(rule.a2 + dyn) % 10,(rule.a3 + dyn) % 10,rule.a4,rule.a5);
                        um2[temp]++;
                    }
                    break;
                }
                case 3:
                {
                    for(int dyn = 1;dyn <= 9;dyn++)
                    {
                        int temp = get_resol(rule.a1,rule.a2,(rule.a3 + dyn) % 10,(rule.a4 + dyn) % 10,rule.a5);
                        um2[temp]++;
                    }
                    break;
                }
                case 4:
                {
                    for(int dyn = 1;dyn <= 9;dyn++)
                    {
                        int temp = get_resol(rule.a1,rule.a2,rule.a3,(rule.a4 + dyn) % 10,(rule.a5 + dyn) % 10);
                        um2[temp]++;
                    }
                    break;
                }
            }
        }
    }
    for(int i = 0;i <= 99999;i++)
    {
        if(exist[i]) continue;
        if(um2[i])
        {
            if(n != 1)
            {
                if(is_valid2(i))
                {
                    ans++;
                    exist[i] = true;
                }
            }
            else
            {
                ans++;
                exist[i] = true;
            }
        }
    }

    return;
}

int main()
{
    //freopen("lock.in","r",stdin);
    //freopen("lock.out","w",stdout);
    int n = read();
    for(int i = 1;i <= n;i++)
    {
        resol temp;
        temp.a1 = read();
        temp.a2 = read();
        temp.a3 = read();
        temp.a4 = read();
        temp.a5 = read();
        rules.emplace_back(temp);
    }

    solve1(n);
    solve2(n);

    printf("%lld\n",ans);

    return 0;
}

我到底在干嘛.jpg

2023/10/31 17:30
加载中...