思路:根据第一行确定所有81种可能,再对照其余行看是否符合,符合则ans++.
//Name: lock.cpp
//Author: AH-S00154
//Last Ver.:2023-10-21 15:07
//Target: 100pts
#include<iostream>
using namespace std;
long long n,ans=0;
int a[9][6],cur[6];
inline bool check(){
for(int i=1;i<n;++i){
int flag=-1,cnt=0,step=-1;
for(int j=0;j<5;++j){
if(a[i][j]!=cur[j]){
cnt++;
if(cnt>=3) return false;
if(flag==-1){
flag=j;
step=cur[j]-a[i][j];
}
else if(j+1!=flag&&j-1!=flag) return false;
else if(cur[j]-a[i][j]!=step) return false;
}
}
}
return true;
}
int main(){
//ifstream fin("lock.in");
cin>>n;
for(int i=0;i<n;++i)
cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3]>>a[i][4];
//fin.close();
for(int i=0;i<5;++i) cur[i]=a[0][i];
for(int i=0;i<5;++i){
for(int k=1;k<=9;++k){
cur[i]=(a[0][i]+k)%10;
if(check()) ans++;
}
cur[i]=a[0][i];
}
for(int i=0;i<=3;++i){
for(int k=1;k<=9;++k){
cur[i]=(a[0][i]+k)%10;
cur[(i+1)%5]=(a[0][(i+1)%5]+1)%10;
if(check()) ans++;
}
}
//ofstream fout("lock.out");
cout<<ans;
//fout.close();
return 0;
}