001:特殊密码锁

001:特殊密码锁

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

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

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

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


int main()
{
    char sa[32],sb[32];
    int a[32]={0},b[32]= {0},fir=1,sec=0,len;
    scanf("%s%s",sa,sb);  len=strlen(sa);
    for(int i=0; i<len; i++)
        if(sa[i]!=sb[i])
        {
            a[i]=1;
            b[i]=1;
        }
//二进制枚举   此处由于只有两钟情况,所以简化了
/*
一般的,二进制枚举可由循环 i getbit(i)进行枚举
*/ a[
0]=!a[0];a[1]=!a[1]; for(int i= 1;i<len;i++) if(a[i-1]){ fir++; a[i]=!a[i]; a[i+1]=!a[i+1]; } for(int i=1;i<len;i++) if(b[i-1]){ sec++; b[i]=!b[i]; b[i+1]=!b[i+1]; }

//


//对结果进行判断
if(a[len-1]==0&&b[len-1]==0) printf("%d",min(fir,sec)); else if(a[len-1]&&b[len-1]) printf("impossible"); else if(a[len-1]) printf("%d",sec); else printf("%d",fir); }

这题 在第一个灯确定后后面的灯都确定了 故枚举 第一个灯 开和关;只有两种情况。

    对于后面的灯来说想让其关闭,只能关闭其下一个灯。因为不能影响前面的灯,而且要把目标灯关闭

猜你喜欢

转载自www.cnblogs.com/tttfu/p/10240712.html