当前位置: 首页 > news >正文

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

1.题意:

从正确密码开始,随机转动密码锁一次,每次可以:

  1. 转动一个拨圈(数字可以增加或减少)

  2. 同时转动两个相邻的拨圈(两个拨圈变化幅度相同)

现在给出了n个锁车后的状态(都不是正确密码),需要计算有多少种可能的正确密码,使得每个正确密码都能通过上述操作产生所有给定的n个状态。

2.思路:

  1. 对于每个可能的正确密码,我们需要验证它是否能通过单次操作(单拨圈或双相邻拨圈转动)生成所有给定的n个状态。

  2. 五位密码共有10^5=100,000种可能,可以全部枚举。

  3. 对于每密码,检查:

    • 对于每个给定的状态,至少存在一种操作(单拨圈或双相邻拨圈转动)能从密码得到该状态

    • 密码不能与任何给定状态相同(题目说明)

  4. 统计满足上述所有条件的密码数量。

3.示例解释

对于样例输入1:

1
0 0 1 1 5

可能的正确密码有81种:

  • 45种通过单拨圈转动得到"00115"(每个位置可以±1,共5个位置×9种变化=45)

  • 36种通过双相邻拨圈转动得到"00115"(4对相邻位置×9种变化=36)

36+45=81

因此输出81。

4.AC代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[10][10];
int p[10];
int main(){
	int n,ans=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=5;j++){
			cin>>a[i][j];
		}
	} 
	for(p[1]=0;p[1]<=9;p[1]++){
		for(p[2]=0;p[2]<=9;p[2]++){
			for(p[3]=0;p[3]<=9;p[3]++){
				for(p[4]=0;p[4]<=9;p[4]++){
					for(p[5]=0;p[5]<=9;p[5]++){
						bool flag=0;
						for(int i=1;i<=n;i++){
							int cnt=0;
							for(int j=1;j<=5;j++){
								if(a[i][j]!=p[j]){
									cnt++;
								}
							} 
							if(cnt>=3 || cnt==0){
								flag=1;
								break;
							}
							if(cnt==1) continue;
							for(int j=1;j<=5;j++){
								if(a[i][j]!=p[j]){
									if(a[i][j+1]==p[j+1]){
										flag=1;
										break;
									}
									if((a[i][j]+10-p[j])%10==(a[i][j+1]+10-p[j+1])%10){
										break;
									}
									else {
										flag=1;
										break;
									}
								}
							}
							if(flag==1) break;
						} 
						if(flag==0) ans++;
					}
				}
			}
		}
	}
	cout<<ans;
	return 0;
}           

http://www.dtcms.com/a/113124.html

相关文章:

  • CNN 里面能自然起到防止过拟合的办法
  • 推荐系统(二十二):基于MaskNet和WideDeep的商品推荐CTR模型实现
  • 基于大模型的重症肌无力的全周期手术管理技术方案
  • Mydumper备份数据库
  • 操作系统内存管理
  • 深入解析 RocketMQ 中的 BrokerOuterAPI 组件​
  • 使用VSCode编写C#程序
  • 低代码开发平台:飞帆中新增控件、修改他人控件
  • Python实现NOA星雀优化算法优化LightGBM分类模型项目实战
  • PyTorch中的Flatten
  • 【学习笔记】Transformers源码分析
  • LeetCode 2442:统计反转后的不同整数数量
  • 存储基石:深度解读Linux磁盘管理机制与文件系统实战
  • 联合、枚举、类型别名
  • Unity UGUI使用手册
  • 基于spring boot的外卖系统的设计与实现【如何写论文思路与真正写出论文】
  • (八)PMSM驱动控制学习---滑膜观测器
  • Pycharm 启动时候一直扫描索引/更新索引 Update index/Scanning files to index
  • Java学习总结-io流-其他流-全体系
  • Raft算法
  • hydra小记(一):深入理解 Hydra:instantiate() 与 get_class() 的区别
  • 【Linux】日志模块实现详解
  • Android学习总结之应用启动流程(从点击图标到界面显示)
  • Java面试黄金宝典35
  • python 重要易忘 语言基础
  • 使用MATIO库写入MATLAB结构体(struct)数据的示例程序
  • 医疗思维图与数智云融合:从私有云到思维图的AI架构迭代(代码版)
  • devbox加cursor编写项目到上线,不到10分钟
  • Day20 -自动化信息收集工具--ARL灯塔的部署
  • APP的兼容性测试+bug定位方法