没有思路 十分暴力
就是把第一个状态的81种情况全试一遍然后一个个排除()
#include<iostream>
#include<cstdio>
using namespace std;
bool cans(int a[],int b[]){
int znum=0,zsk[5][2]={},l=0;
for(int i=0;i<5;++i){
if(a[i]-b[i]==0) znum++;
else{
zsk[l][0]=i;
zsk[l][1]=(a[i]-b[i]<0?a[i]-b[i]+10:a[i]-b[i]);
l++;
}
}
if(znum==4) return true;
else if(znum==5||znum<=2) return false;
else return !(zsk[0][0]-zsk[1][0]!=-1||zsk[0][1]!=zsk[1][1]);
}
int main(){
// freopen("lock.in","r",stdin);
// freopen("lock.out","w",stdout);
int n;
scanf("%d",&n);
int lis[n][5];
for(int i=0;i<n;++i) for(int j=0;j<5;++j) scanf("%d",&lis[i][j]);
if(n==1) printf("81");
else{
int map[81][6],l=0,sum=81;
//只转一个拨圈
for(int s=1;s<=9;++s){
for(int q=0;q<5;++q){
for(int i=0;i<5;++i) if(i!=q) map[l][i]=lis[0][i];
map[l][q]=(lis[0][q]+s)%10;
map[l][5]=1;
l++;
}
}
//转相邻两个拨圈
for(int s=1;s<=9;++s){
for(int q=0;q<4;++q){
for(int i=0;i<5;++i) if(i!=q&&i!=q+1) map[l][i]=lis[0][i];
map[l][q]=(lis[0][q]+s)%10;
map[l][q+1]=(lis[0][q+1]+s)%10;
map[l][5]=1;
l++;
}
}
for(int p=0;p<l;p++){
for(int i=0;i<n;i++){
if(!cans(lis[i],map[p])){
sum--;
break;
}
}
}
printf("%d",sum);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}