题解
2026-10-07 20:20:45
发布于:广东
3阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
int n,a[9][6],ans;
int rec[6];//rec:dfs枚举时存放当前候选正确密码(下标1~5)
bool check(int rec[6]){
for(int i=1;i<=n;i++){
int cnt=0,difp[6],difv[6];//cnt:不同位数;difp:不同位的位置;difv:不同位的变化量
for(int j=1;j<=5;j++){
if(rec[j]!=a[i][j]){//不同
difp[cnt]=j;
difv[cnt++]=(a[i][j]-rec[j]+10)%10;//记录变化量(从rec转到a[i]),然后cnt自增
}
}
if(cnt==0) return 0;//完全相同
if(cnt==1) continue;//只有1位不同
if(cnt==2){ //相邻且变化量相同:可同时转两个相邻拨圈,合法
if(difp[1]-difp[0]==1&&difv[0]==difv[1]) continue;
}
return 0;
}
return 1;
}
void dfs(int x){ //dfs:枚举密码的每一位,x表示当前正在填第几位(1~5) 可用5层循环替代
if(x==6){
if(check(rec)) ans++;
return;
}
for(int i=0;i<=9;i++){
rec[x]=i;
dfs(x+1);
}
}
int main(){
freopen("lock.in","r",stdin);
freopen("lock.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=5;j++) cin>>a[i][j];
}
dfs(1);
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也








有帮助,赞一个