贤鱼的刷题日常----8469:特殊密码锁

简介: 讲解特殊密码锁,题目题解

在这里插入图片描述

题目 8469:特殊密码锁
预计阅读时间 25分钟

题目详情

描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。

然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。

当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。

输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
样例输入
011
000
样例输出
1

AC代码(内有详细思路,请放心食用^^)

在这里插入图片描述

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[100086],b[100086];
int a1[100086],b1[100086],a2[1000086];
int main(){
    cin>>(a+1)>>(b+1);//本人比较喜欢从1开始,所以这里加1输入
    int len=strlen(a+1);//记录长度
    for(int i=1;i<=len;i++){
        a1[i]=a[i]-'0';
        a2[i]=a1[i];
        b1[i]=b[i]-'0';
    }
    int s1=0,s2=0;
    //1;
    s1++;
    int f1=0,f2=0;
        a1[1]=!a1[1];//1变成0,0变成1
        a1[2]=!a1[2];//这里分为两种情况,一种是第一个强改,第二个可以理解为顺其自然,找到两个里面较小的一个。这里首先将a1中的值强改,所以第一位第二位都要变成他对应的值
        for(int i=2;i<=len;i++){
            if(a1[i-1]!=b1[i-1]){//如果不匹配直接改
                s1++;
                a1[i-1]=!a1[i-1];
                a1[i]=!a1[i];//题目要求,改一个会影响周围
                a1[i+1]=!a1[i+1];
            }
            if(i==len&&a1[i]==b1[i]){//长度相等并且最后一位必须一样,这里不去管其他的数字的原因是因为这一位变化了,下一位如果不同还会变回来,或者说看到样例,011--000,这里再这个循环肯定不对,因为第一位不需要改,在下一个循环中会有详细i介绍
                f1=1;
            }
        }
        for(int i=2;i<=len;i++){
            if(a2[i-1]!=b1[i-1]){
                s2++;//这里和上面处理方法一样
                a2[i-1]=!a2[i-1];
                a2[i]=!a2[i];
                a2[i+1]=!a2[i+1];
            }
            if(i==len&&a2[i]==b1[i]){
                f2=1;//解释一下011--000,这里在第一个1的时候会改变前后的值,于是变成了100,可是这个和000不一样啊?问题不大,正确处理方法因该是最后一个1按下去,变换了000,可是这两个都是一步,有什么区别呢?有些人可能说是凑巧,不过可以多处几组数据试试奥
            }
        }
        if(f1==0&&f2==0){
            cout<<"impossible";//在上面处理的时候如果两个都不成那么就是不可能
            return 0;
        }
        if(f1==1&&f2==0){//这里找有答案的一个
            cout<<s1;
            return 0;
        }else if(f1==0&&f2==1){
            cout<<s2;
            return 0;
        }
        if(s1>s2){//都有答案找一个小的
            cout<<s2;
        }else{
            cout<<s1;
        }

    
}

@^ _ ^@

相关文章
|
10月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
738 56
|
11月前
|
人工智能 搜索推荐 机器人
挑战未来职场:亲手打造你的AI面试官——基于Agents的模拟面试机器人究竟有多智能?
【10月更文挑战第7天】基于Agent技术,本项目构建了一个AI模拟面试机器人,旨在帮助求职者提升面试表现。通过Python、LangChain和Hugging Face的transformers库,实现了自动提问、即时反馈等功能,提供灵活、个性化的模拟面试体验。相比传统方法,AI模拟面试机器人不受时间和地点限制,能够实时提供反馈,帮助求职者更好地准备面试。
643 2
|
Ubuntu Linux
在Linux中,如何配置静态和动态IP地址?
在Linux中,如何配置静态和动态IP地址?
|
存储 数据管理 数据库
理解数据库中的参照完整性
【6月更文挑战第13天】数据库设计旨在创建和维护企业的数据管理系统,确保数据完整性和消除冲突。好的数据库设计应减少冗余,保证信息准确完整,并满足处理和报告需求。设计工具包括E-R图和UML等。
1073 2
理解数据库中的参照完整性
|
SQL JSON 分布式计算
DataWorks操作报错合集之如何解决在创建Hologres开发节点时报错
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的在线视频教育系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的在线视频教育系统的详细设计和实现(源码+lw+部署文档+讲解等)
199 1
|
敏捷开发 测试技术 持续交付
极限编程(XP)原理与技巧:深入解析与实践
【5月更文挑战第8天】极限编程(XP)是一种敏捷开发方法,注重快速反馈、迭代开发和简单设计,以提高软件质量和项目灵活性。关键原则包括客户合作、集体代码所有权、持续集成等。实践中,使用故事卡片描述需求,遵循编程约定,实行TDD,持续重构,结对编程,并定期举行迭代会议。通过理解和应用XP,团队能提升效率,应对变化。
Java Map.Entry接口详解
Java Map.Entry接口详解
|
安全 Java Go
Go 调用 C/C++ 函数全攻略
Go 调用 C/C++ 函数全攻略
829 0