
特殊密码锁
发布日期:2021-05-08 17:20:14
浏览次数:23
分类:原创文章
本文共 1940 字,大约阅读时间需要 6 分钟。
描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
思路: 一个按钮按两下相当于没按, 按三下相当于按一下。
按下一个按钮保证前面的灯都是符合期望状态,枚举到最后一盏灯如果也可以符合期望状态,即可以实现转变。
eg: 如果第 i 盏 不符合期望状态, 按下第 i+1 盏灯 , 第 i 盏灯则会符合期望状态 , 不影响前面的状态。
特殊情况: 第一盏灯,前面没灯限制, 所以要考虑两种情况, 按第一盏灯, 不按第一盏灯。
数据:110 000 ; 101 000;
最后两盏灯, 只能按下最后一盏灯改变两盏灯, 或者都不按。
数据:011 000;
代码:
#include <stdio.h>#include <string.h>const int N = 35;char a[N], b[N], c[N];char fan(char ch) // 按下的翻转操作{ if(ch == '1') return ch = '0'; return ch = '1';}int main(){ scanf ("%s %s",a,b); strcpy(c, a); int alen, blen; alen = strlen(a); blen = strlen(b); int ans = 0; for(int i=0; i <= alen - 2; i++) // 不按第一盏灯的情况 { if(a[i] != b[i]) // 如果第 i盏灯 不符合期望状态 { ans ++; if(i < alen-2) // 如果不是最后两盏灯按下 第 i+1 盏灯 { a[i] = fan(a[i]); a[i+1] = fan(a[i+1]); a[i+2] = fan(a[i+2]); } else // 最后两盏只能按下最后一盏灯 { a[i] = fan(a[i]); a[i+1] = fan(a[i+1]); } } } int ans1 = 1; // 按第一盏灯的情况 c[0] = fan(c[0]), c[1] = fan(c[1]); for(int i=0; i <=alen-2; i++) { if(c[i] != b[i]) // 如果第 i盏灯 不符合期望状态 { ans1 ++; if(i < alen-2) // 如果不是最后两盏灯按下 第 i+1 盏灯 { c[i] = fan(c[i]); c[i+1] = fan(c[i+1]); c[i+2] = fan(c[i+2]); } else // 最后两盏只能按下最后一盏灯 { c[i] = fan(c[i]); c[i+1] = fan(c[i+1]); } } } if(strcmp(a, b) == 0) printf("%d\n",ans); else if(strcmp(b, c) == 0) printf("%d\n",ans1); else printf("impossible\n"); return 0;}
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月03日 18时59分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
阿里巴巴Json工具-Fastjson教程
2019-03-06
Spring Cloud Gateway - 快速开始
2019-03-06
Spring Security 实战干货:理解AuthenticationManager
2019-03-06
Java对象转JSON时如何动态的增删改查属性
2019-03-06
Python 面向对象进阶
2019-03-06
Linux常用统计命令之wc
2019-03-06
Git安装及使用以及连接GitHub方法详解
2019-03-06
docker容器与虚拟机的区别
2019-03-06
shell脚本里使用echo输出颜色
2019-03-06
Python2跟Python3的区别
2019-03-06
并发编程——IO模型详解
2019-03-06
Java之封装,继承,多态
2019-03-06
wait()与notify()
2019-03-06
使用js打印时去除页眉页脚
2019-03-06
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
2019-03-06
ORA-00904: "FILED_TYPE": 标识符无效
2019-03-06
数据仓库系列之维度建模
2019-03-06
Scala教程之:函数式的Scala
2019-03-06
java中DelayQueue的使用
2019-03-06
线程stop和Interrupt
2019-03-06