最后1点WA,输出0,应该是1
看昏头了也没看出怎么错了,重新理解考场代码真不容易qwq
思路挺简单,把所有可能情况枚举出来,然后一个个判断,最后输出符合条件的
#include <bits/stdc++.h>
using namespace std;
int n,p[10][7],pt[83][7];
bool pf[83];
bool cmp (int x[],int y[]) {
return x[1] == y[1] && x[2] == y[2] && x[3] == y[3] && x[4] == y[4] && x[5] == y[5];
}
int main() {
//freopen("lock.in","r",stdin);
//freopen("lock.out","w",stdout);
scanf("%d",&n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 5; j++) {
scanf("%d",&p[i][j]);
}
}
int mytemp = 1;
for (int i = 1; i <= 81; i++) {
for (int j = 1; j <= 5; j++) {
pt[i][j] = p[1][j];
}
}
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 9; j++) {
if (pt[mytemp][i] + j < 10) {
pt[mytemp][i] += j;
}else{
pt[mytemp][i] += j - 10;
}
mytemp++;
}
}
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 9; j++) {
if (pt[mytemp][i] + j < 10) {
pt[mytemp][i] += j;
}else{
pt[mytemp][i] += j - 10;
}
if (pt[mytemp][i+1] + j < 10) {
pt[mytemp][i+1] += j;
}else{
pt[mytemp][i+1] += j - 10;
}
mytemp++;
}
}
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= 81; j++) {
if (pf[j]) continue;
if (cmp(pt[j],p[i])) {
pf[j] = true;
continue;
}
int te1 = 1e9,te2 = 1e9,tf = 0,tp1,tp2;
if (pt[j][1] != p[i][1]){
tf++;
tp1 = 1;
te1 = pt[j][1] - p[i][1];
}
if (pt[j][2] != p[i][2]){
tf++;
if (tf == 2) {
tp2 = 2;
te2 = pt[j][2] - p[i][2];
}else{
tp1 = 2;
te1 = pt[j][2] - p[i][2];
}
}
if (pt[j][3] != p[i][3]){
tf++;
if (tf == 2) {
tp2 = 3;
te2 = pt[j][3] - p[i][3];
}else{
tp1 = 3;
te1 = pt[j][3] - p[i][3];
}
}
if (pt[j][4] != p[i][4]){
tf++;
if (tf == 2) {
tp2 = 4;
te2 = pt[j][4] - p[i][4];
}else{
tp1 = 4;
te1 = pt[j][4] - p[i][4];
}
}
if (pt[j][5] != p[i][5]){
tf++;
if (tf == 2) {
tp2 = 5;
te2 = pt[j][5] - p[i][5];
}else{
tp2 = 5;
te1 = pt[j][5] - p[i][5];
}
}
if (tf > 2) {
pf[j] = true;
continue;
}else if (tf == 2 && (te2 != te1 || abs(tp1 - tp2) != 1)) {
pf[j] = true;
continue;
}
}
}
int ans = 0;
for (int i = 1; i <= 81; i++) {
if(!pf[i]) {
ans++;
}
}
printf("%d",ans);
return 0;
}