洛谷P9752 [CSP-S 2023] 密码锁题解

#题目描述

 

 #思路分析

读完题就会发现 , 一共有两种拨动密码锁的方式

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;
}
/*

*/

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值