展示一下我极为丑陋的代码:
#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