首页 > 其他分享 >NKOJ 3631 密码锁

NKOJ 3631 密码锁

时间:2024-12-14 09:54:43浏览次数:4  
标签:nxt NKOJ work tp 3631 que mp n2 密码锁

NKOJ 3631 密码锁

思路

  • BFS经典题。

实现方法

  • 用一个结构体存储当前密码锁的状态和已经走过的步数。
  • 将开始的状态入队。
  • 每次取出队首,枚举所有可能情况。
    • 每一位的上下拨动。
    • 每两位之间的交换。
    • 共 \(11\) 种情况。
  • 给入队的情况打标记。

代码

#include<map>
#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{int n1,n2,n3,n4,stp;};
int work(node x){
	return x.n1*1000+x.n2*100+x.n3*10+x.n4; 
}
int mp[9999];
int change(int x){
	if(x>=9) return 1;
	else return x+1; 
}
int shift(int x){
	if(x<=1) return 9;//注意点1
	else return x-1;
}
void bfs(node st,node en){
	queue<node> que;
	que.push(st);
	while(!que.empty()){
		node tp=que.front();
		que.pop();
		if(tp.n1==en.n1&&tp.n2==en.n2&&tp.n3==en.n3&&tp.n4==en.n4){
			printf("%d",tp.stp);
			return;
		}
		node nxt=tp;
		nxt.stp++;
		//1
		nxt.n1=change(tp.n1);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		nxt.n1=shift(tp.n1);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		nxt.n1=tp.n1;
		//2
		nxt.n2=change(tp.n2);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		nxt.n2=shift(tp.n2);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		nxt.n2=tp.n2;
		//3
		nxt.n3=change(tp.n3);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		nxt.n3=shift(tp.n3);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		nxt.n3=tp.n3;
		//4
		nxt.n4=change(tp.n4);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		nxt.n4=shift(tp.n4);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		nxt.n4=tp.n4;
		//1,2
		swap(nxt.n1,nxt.n2);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		swap(nxt.n1,nxt.n2);
		//2,3
		swap(nxt.n2,nxt.n3);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		swap(nxt.n2,nxt.n3);
		//3,4
		swap(nxt.n3,nxt.n4);
		if(mp[work(nxt)]==0) que.push(nxt),mp[work(nxt)]=1;
		swap(nxt.n3,nxt.n4);
	}
}
int main(){
	node st,en;
	scanf("%d%d%d%d",&st.n1,&st.n2,&st.n3,&st.n4);
	scanf("%d%d%d%d",&en.n1,&en.n2,&en.n3,&en.n4);
	st.stp=0,en.stp=0;
	bfs(st,en);

	return 0;
}

本题特色

  • Q:为什么状压?
  • A:在打标记时原本状态较多,每一个状态如果用一个 int 存储将会光荣 MLE
  • Q:怎么压?
  • A:注意到题目说每一位都在 \(1 \sim 9\) 之间。这时用能存储 \(2 \times 10^9\) 大小的 int 有亿点浪费,而一个整数的每一位刚好能存 \(1 \sim 9\) 之间的数(在保证首位不为 \(0\) 的情况下)。所以将每个状态标记转化为十进制数存储,大大节省数组空间。

注意事项

  1. 注意在写变换函数的时候,不要把 \(+1\) 和 \(-1\) 搞错了。

标签:nxt,NKOJ,work,tp,3631,que,mp,n2,密码锁
From: https://www.cnblogs.com/hsr-ray-blog/p/18606407

相关文章

  • NKOJ 2110 美丽的星空
    NKOJ2110美丽的星空思路洪水填充(BFS)+多边形全等的判定。实现方法这道题比较复杂,分为三个步骤。用BFS求出有哪些星座并编号。两两判全等。多边形的全等判定定理:如果两多边形每两个点之间的距离和相等,则它们全等。如果两个多边形全等,就将新的打上旧的的标记。......
  • 禁用SAP Hana错误密码锁定用户功能
    背景公司项目适配多种数据库其中包含SAPHana,由于有同事的数据库连接工具保存了某个在用的数据库的旧密码,导致时不时会被锁用户。通过查询官方文档已解决,这里统一记录一下。禁用密码锁定方法以下按系统管理员和普通用户的解法分别列出。禁用SYSTEM管理员密码锁定查找安装Hana......
  • 基于Multisim的密码锁的控制电路设计与仿真
    设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;在锁的控制电路中储存一个可以修改的4位代码,当开锁按钮开关(可设置成6位至8位,其中实际有效为4位,其余为虚设)的输入代码等于储存代码时,开锁从第一......
  • [CSP-S 2023] 密码锁
    题目描述小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从 00 到 99 的数字。每个拨圈都是从 00 到 99 的循环,即 99 拨动一个位置后可以变成 00 或 88,因为校园里比较安全,小Y采用的锁车方式是:从正确密码开始,随机转动密码锁仅一次;每次都是以某个幅度仅转......
  • 矩阵键盘与密码锁
    目录1.矩阵键盘介绍​编辑 2.扫描的概念3.代码演示(读取矩阵键盘键码)4.矩阵键盘密码锁1.矩阵键盘介绍为了减少I/O口的占用,通常将按键排列成矩阵形式,采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 2.扫描的概念1)数码管扫描(输出扫描)原理:显示第1位→显示......
  • 51单片机项目:进阶版密码锁(附代码详解)
    一、基本功能简介1.四位密码锁        默认密码为1201(小彩蛋*1),后续可自由修改密码。2.输入密码        按下不同按键,输入相应的数字(最多输入四位,输入少于四位使用0补全)按键与数字对应表按键数字S11S22S33S44S55S66S77S88S99S100......
  • 基于单片机超市存物箱存包柜储物柜管理密码锁系统
    **单片机设计介绍,基于单片机超市存物箱存包柜储物柜管理密码锁系统文章目录一概要二、功能设计设计思路三、软件设计原理图五、程序六、文章目录一概要  基于单片机超市存物箱存包柜储物柜管理密码锁系统的概要可以从以下几个方面进行阐述:一、设计背景......
  • 基于51单片机的RFID密码锁门禁系统设计资料(源码+原理图等)
    目录1、实物图  2、原理图3、PCB4、器件清单5、设计描述6、源码 7、资料清单资料下载地址:基于51单片机的RFID密码锁门禁系统设计资料(源码+原理图+论文等)​​​​​​​1、实物图  2、原理图3、PCB 4、器件清单5、设计描述 本设计采用STC89C52作......
  • Android 14.0 启动app时设置密码锁
    1.前言在14.0的系统产品开发中,对于限制某些app的启动的功能中,在项目中的需求是在点击app启动的时候,根据包名设置密码锁,当输入正确的密码的时候来启动这个app,否则就不能启动这个app,达到限制使用app的目的,这就需要在app启动的时候,检测app的包名,然后在app启动的时候弹出输入密......
  • 小猴编程周赛C++ | 密码锁
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】小猴有一个密码锁,密码锁是由n个轮子组成,每个轮子上都写着数字a......