题目
P9752 [CSP-S 2023] 密码锁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
因为数据极小,爆搜就可以了
#include<bits/stdc++.h>
using namespace std;
int n,A[6][10],ans=0;
int pd(int a,int b,int c,int d,int e){
for(int i=1;i<=n;i++){
int fl=0;
int aa=(a-A[1][i]+10)%10;//看第一位变多少
int bb=(b-A[2][i]+10)%10;// .
int cc=(c-A[3][i]+10)%10;// .
int dd=(d-A[4][i]+10)%10;// .
int ee=(e-A[5][i]+10)%10;//看第五位变多少
if(aa==0)fl++;//一位动了?
if(bb==0)fl++;//.
if(cc==0)fl++;//.
if(dd==0)fl++;//.
if(ee==0)fl++;//五位动了?
if(fl==4)continue;//只动了一位密码,一定成立,测试下一个约束
if(fl==3){//动了两位密码,判断 两位密码是否增减相同 且 紧挨
if(aa==bb&&aa!=0)continue;
if(bb==cc&&bb!=0)continue;
if(cc==dd&&cc!=0)continue;
if(dd==ee&&dd!=0)continue;
}
return 0;//若以上判断皆不满足,说明密码abcde不正确,返回0
}
return 1;//没执行过24 说明密码abcde满足,ans+1
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=5;j++){
cin>>A[j][i];
}
}//输入 A[1][i]表示第i组密码的第一位
for(int a=0;a<=9;a++)
for(int b=0;b<=9;b++)
for(int c=0;c<=9;c++)
for(int d=0;d<=9;d++)
for(int e=0;e<=9;e++)//暴力枚举所有可能
ans+=pd(a,b,c,d,e);
cout<<ans;
return 0;
}
菜鸡写的第一篇题解,少喷点,谢谢