记录编号 |
595357 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[CSP 2023S]密码锁 |
最终得分 |
100 |
用户昵称 |
dustsans |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.036 s |
提交时间 |
2024-10-12 20:47:01 |
内存使用 |
3.76 MiB |
显示代码纯文本
//根据题目可以得出正确密码只转一个圈或两个圈就可以达到所给出的n个状态(每一圈可以随意变换,但只能转一次)
//即求n个状态可以到达所有密码的交集
//那么我们可以将这n种状态所能到达的所有情况都列举出来,用记录所有到达密码的次数,如果次数为n(即所有状态都可以转到这一个密码),那么正确密码数加1
//最后输出正确密码的数量即为正确答案
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int cnt=0;//记录正确密码的可能个数
int a[N][N];//记录n个状态的每一位数字
int t[N][N][N][N][N];//记录n个状态所到达密码的个数(每一位即为对应密码的每一位数字)
int main(){
freopen("lock.in","r",stdin);
freopen("lock.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;++i){
for(int j=1;j<=5;++j){
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=9;++j){
++t[(a[i][1]+j)%10][a[i][2]][a[i][3]][a[i][4]][a[i][5]];
++t[a[i][1]][(a[i][2]+j)%10][a[i][3]][a[i][4]][a[i][5]];
++t[a[i][1]][a[i][2]][(a[i][3]+j)%10][a[i][4]][a[i][5]];
++t[a[i][1]][a[i][2]][a[i][3]][(a[i][4]+j)%10][a[i][5]];
++t[a[i][1]][a[i][2]][a[i][3]][a[i][4]][(a[i][5]+j)%10];//只转一圈的情况
++t[(a[i][1]+j)%10][(a[i][2]+j)%10][a[i][3]][a[i][4]][a[i][5]];
++t[a[i][1]][(a[i][2]+j)%10][(a[i][3]+j)%10][a[i][4]][a[i][5]];
++t[a[i][1]][a[i][2]][(a[i][3]+j)%10][(a[i][4]+j)%10][a[i][5]];
++t[a[i][1]][a[i][2]][a[i][3]][(a[i][4]+j)%10][(a[i][5]+j)%10];//转两圈的情况
}
}
for(int i=0;i<=9;++i){
for(int j=0;j<=9;++j){
for(int i1=0;i1<=9;++i1){
for(int i2=0;i2<=9;++i2){
for(int i3=0;i3<=9;++i3){
if(t[i][j][i1][i2][i3]==n){
cnt++;//表示n种状态都可以达到这一种号码,即正确密码
}
}
}
}
}
}
printf("%d",cnt);
fclose(stdin);
fclose(stdout);
return 0;
}