#题目描述
#思路分析
读完题就会发现 , 一共有两种拨动密码锁的方式
1 . 只拨动一个拨圈。
2.同时拨动两个拨圈,且由生活实际得知拨动的一定是两个相邻的拨圈
由此我们可以得知样例的计算方法:
加上这个题数据范围很小,只有:
所以这个题可以一一枚举每一个拨圈及其拨动情况,从所给的状态反推可能的正确答案。
还需注意,除了n = 1 的情况外 , 其他情况下的可能的正确答案都是所给状态可能的正确答案的
交集
下面直接给出代码。
#AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int N=2e5+7;
int n;
int cnt;
int a , b ,c ,d ,e;
int box[N];//最大情况为9 9 9 9 9;
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>n;
int tmp = n;
while(tmp--){
cin>>a>>b>>c>>d>>e;
//只拨动一种的情况
for(int i=0;i<=9;i++){
if(a==i) continue;
box[i*10000+b*1000+c*100+d*10+e]++;
}
for(int i=0;i<=9;i++){
if(b==i) continue;
box[a*10000+i*1000+c*100+d*10+e]++;
}
for(int i=0;i<=9;i++){
if(c==i) continue;
box[a*10000+b*1000+i*100+d*10+e]++;
}
for(int i=0;i<=9;i++){
if(d==i) continue;
box[a*10000+b*1000+c*100+i*10+e]++;
}
for(int i=0;i<=9;i++){
if(e==i) continue;
box[a*10000+b*1000+c*100+d*10+i]++;
}
//------拨动两种的情况------
for(int i=1;i<=9;i++){
box[(a+i)%10*10000+(b+i)%10*1000+c*100+d*10+e]++;
}
for(int i=1;i<=9;i++){
box[a*10000+(b+i)%10*1000+(c+i)%10*100+d*10+e]++;
}
for(int i=1;i<=9;i++){
box[a*10000+b*1000+(c+i)%10*100+(d+i)%10*10+e]++;
}
for(int i=1;i<=9;i++){
box[a*10000+b*1000+c*100+(d+i)%10*10+(e+i)%10]++;
}
}
if(n==1){
cout<<81;
return 0;
}
//n==1的情况已经排除,剩下的所有可能都必须考虑交集
//for从i=0开始查找,因为可能有0 0 0 0 0的情况
for(int i=0;i<=99999;i++){
if(box[i]==n){//这个答案可以满足输入的三个状态
cnt++;
}
}
cout<<cnt;
return 0;
}
/*
*/