特殊密码锁

总时间限制: 
1000ms

内存限制: 
1024kB
描述

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

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

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

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

样例输出

1

分析

只需要考虑是否按下第一个灯。因为如果第一个灯的状态被确定了,那么是否按下第二个灯也就决定了(如果第一个灯与期望不同,则按下,如果期望相同,则不按下)同理,第三个灯是否按下也唯一确定。

所以,本题只要分两种情况:灯1被按下和没有被按下 
之后使用for循环判断别的灯是否需要按下即可 
当循环结束,若现在的灯况与答案相同,则输出两种方案中按键次数最少的,若不同,则impossible

代码

#include <cstdio>
#include <cstring>
char str[33];
char str1[33];
char str2[33];
int len;
char change(char s){
    if(s == ‘1‘)return ‘0‘;
    else return ‘1‘;
}
int resolve(int p){
    for(int i = 2;i <= len;i++){
        /*验证一下 str1的改变
        for(int j = 1;j <= len;j++)
            printf("%c",str1[j]);
        printf("\n");

        for(int j = 1;j <= len;j++)
            printf("%c",str2[j]);
        printf("\n");
        */
        if(str1[i-1] != str2[i-1]){
            p++;
            str1[i] = change(str1[i]);
            if(i != len)
            str1[i+1] = change(str1[i+1]);
        }
    }
    //printf("%c vs %c\n",str1[len],str2[len]);
    if(str1[len] != str2[len])return -1;    //最后一个字符不相等,说明无法转换为目标状态
    return p;
}
int main(){
    scanf("%s",str+1);
    scanf("%s",str2+1);
    len = strlen(str+1);
    for(int i = 1;i <= len;i++)
        str1[i] = str[i];
    //将第一个按钮按下
    str1[1] = change(str1[1]);
    str1[2] = change(str1[2]);
    int ans = resolve(1);
    //printf("ans:%d\n ",ans);
    //不按下第一个按钮
    for(int i = 1;i <= len;i++) //这里要用str重置str1,因为它已经被改变了
        str1[i] = str[i];
    int ans2 = resolve(0);
    //printf("ans2:%d\n ",ans2);
    if(ans == ans2 && ans == -1)printf("impossible");
    else{
        if(ans == -1 || ans2 == -1)
             printf("%d",ans > ans2 ? ans : ans2);
        else
             printf("%d",ans < ans2 ? ans : ans2);
    }
}
时间: 2024-10-11 15:24:13

特殊密码锁的相关文章

openjudge8469特殊密码锁[贪心]

描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮. 当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态. 输入两行,给出两个由0.1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸.输出至少需要进行的按按钮操作次数,如果无法实现

iOS开发——高级技术&amp;密码锁功能的实现

密码锁功能的实现 一个ios手势密码功能实现 ipad/iphone 都可以用 没有使用图片,里面可以通过view自己添加 keychain做的数据持久化,利用苹果官方KeychainItemWrapper类 keychain存储的数据不会因为删除app而清除记录,请调用-(void)clear清除储存密码. 简单使用方式 下载后直接把 GesturePassword 下的GesturePassword文件丢到项目中去 在 TARGETS - Build Phases - "KeychainIt

密码锁

密码锁 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 153(129 users) Total Accepted: 135(126 users) Rating: Special Judge: No Description 小D在尝试打开一个很有挑战性的密码锁,这个锁上面一共有 n 个按钮用来打开. 小D必须输入之前设置好的密码序列才能打开这个锁.每次按下一个按钮,这个按钮要么陷入(这个表示小D猜对了密码当前这位的数并准备按密码序列

一个密码锁加密应用项目源码

源码ToolWizAppLock,一个密码锁应用,加密你的应用,照片,视频文件. 在生活中,你有没有担心过手机里的某些应用被别人偷看,比如微信聊天记录.短信.照片? 你是否担心一些重要图片,视频等重要资料被偷窥? 有了密码锁,您只需将不想被别人查看的应用在我这里锁住,设置好密码,就可以高枕无忧了! 您只需将重要的图片,视频等文件在我这里加密,再也不怕被别人窃取你的隐私了! 源码下载: http://code.662p.com/view/11470.html <ignore_js_op> 详细说

NOI OpenJudge 8469 特殊密码锁 Label贪心

描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮. 当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态. 输入两行,给出两个由0.1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸.输出至少需要进行的按按钮操作次数,如果无法实现

安卓应用程序密码锁的实现

功能: 1.应用程序程序中设置了密码锁,每当用户打开应用时,要弹出密码输入界面: 2.当用户按住home键,将程序隐在后台而非退出,经过一段时间后,再重新启动,也要弹出密码输入界面: 3.当应用在前台的时候,用户按住power电源键,关闭屏幕后,再点亮屏幕,这个时候也要弹出密码输入界面 实现方式: 1.针对功能1,每次启动应用进入主界面时,判断是否需要弹出密码输入界面: 2.关键点在于怎么判断程序是否处在前台跟后台. 判断方法: public static boolean isAppOnFore

8469:特殊密码锁

传送门:http://noi.openjudge.cn/ch0406/8469/ 描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮. 当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态. 输入 两行,给出两个由0.1组成的等长字符串,表示当前/目

【NOIP模拟赛】密码锁

题目描述 hzwer有一把密码锁,由N个开关组成.一开始的时候,所有开关都是关上的.当且仅当开关x1,x2,x3,…xk为开,其他开关为关时,密码锁才会打开. 他可以进行M种的操作,每种操作有一个size[i],表示,假如他选择了第i种的操作的话,他可以任意选择连续的size[i]个格子,把它们全部取反.(注意,由于黄金大神非常的神,所以操作次数可以无限>_<) 本来这是一个无关紧要的问题,但是,黄金大神不小心他的钱丢进去了,没有的钱他哪里能逃过被chenzeyu97 NTR的命运?>_

linux下利用adb连接Android模拟器查看内核版本、cpu体系架构版本、删除密码锁

在前面的两篇文章中,讲述了编译android源码和内核源码,此篇文章建立在之前的基础上,不清楚的请先转战: 源码编译 内核编译 --------------------------------------------------------------------------------------------- 在使用了下面的命令启动了模拟器之后: export PATH=$PATH:/usr/local/Android/Android2.3.7/out/host/linux-x86/bin