1 条题解

  • 2
    @ 2024-8-22 16:53:38

    题干是给定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;
    }``````
    • @ 2024-8-22 20:58:11

      厉害,直接二等奖

  • 1

信息

ID
25
时间
1000ms
内存
256MiB
难度
10
标签
递交数
3
已通过
1
上传者