1 条题解
-
2
题干是给定n种锁密码锁的状态,输出可能存在的密码的方案数,从数据n<8可以看出,这题可以采取暴力枚举所有可能的方案,放进数组进行统计即可(不建议学习这种
打表方法只是提供一种思路不是正解)。#include <bits/stdc++.h> using namespace std; int vis[100005];//用来统计方案的数组 int cnt;//记录方案数 int main(){ int n; cin>>n; if(n==1){//特判当n==1时方案数都为81 cout<<81; return 0; } int m=n;//n会改变所以定义一个变量存n的原值 while(n--){ int a,b,c,d,e; cin>>a>>b>>c>>d>>e; int a1=a,b1=b,c1=c,d1=d,e1=e;//用来循环枚举 int a2=a,b2=b,c2=c,d2=d,e2=e;//存原值 a*=10000;b*=1000;c*=100;d*=10;//将密码变成一个五位数方便存入数组 for(int i=1;i<=5;i++){//枚举转动一个拨圈的情况 for(int j=1;j<=9;j++){ if(i==1){ e1++; if(e1>9) e1=0;//这一步操作9变成0 vis[a+b+c+d+e1]++;//存数 } if(i==2){ d1++; if(d1>9) d1=0; vis[a+b+c+e+d1*10]++; } if(i==3){ c1++; if(c1>9) c1=0; vis[a+b+d+e+c1*100]++; } if(i==4){ b1++; if(b1>9) b1=0; vis[a+c+d+e+b1*1000]++; } if(i==5){ a1++; if(a1>9) a1=0; vis[b+c+d+e+a1*10000]++; } } a1=a2;b1=b2;c1=c2;d1=d2;e1=e2;//赋回原值 } for(int i=1;i<=4;i++){//枚举转动两个的与上面步骤相似 for(int j=1;j<=9;j++){ if(i==1){ d1++;e1++; if(d1>9) d1=0; if(e1>9) e1=0; vis[a+b+c+d1*10+e1]++; } if(i==2){ c1++;d1++; if(c1>9) c1=0; if(d1>9) d1=0; vis[a+b+c1*100+e+d1*10]++; } if(i==3){ b1++;c1++; if(b1>9) b1=0; if(c1>9) c1=0; vis[a+b1*1000+d+e+c1*100]++; } if(i==4){ a1++;b1++; if(a1>9) a1=0; if(b1>9) b1=0; vis[a1*10000+c+d+e+b1*1000]++; } } a1=a2;b1=b2;c1=c2;d1=d2;e1=e2; } } for(int i=1;i<=99999;i++){ if(vis[i]==m){//如果一个答案在每种状态下都出现则让方案数++ //cout<<i<<endl; cnt++; } } cout<<cnt; return 0; }``````
- 1
信息
- ID
- 25
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者