密码锁问题

来源:互联网 发布:世界历史书籍知乎 编辑:程序博客网 时间:2024/05/03 08:26

描述

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

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

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

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

011000
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>void flip(int i,char s[],int n);int min(int x,int y);
int main(){    char s[31],a[31],temp[31];    int n=0,i,j=0,ans=1e8,mx2=0;    gets(s);    gets(a);    for(i=0;i<31;i++)    {        n++;    if(s[i]=='\0')    {        break;    }    }    for(i=0; i<n-1; i++)    {        if(s[i]!=a[i])        {            j++;            flip(i+1,s,n-1);        }
    }     if(strcmp(s,a)==0)        {            ans=j;        }    strcpy(s,temp);    s[0]=s[0]=='1'?'0':'1';    s[1]=s[1]=='1'?'0':'1';    for(i=1;i<n-1;i++)    {        if(s[i-1]!=a[i-1])        {            mx2++;            flip(i,s,n-1);        }    }    if(strcmp(s,a)==0)        {            ans=min(ans,mx2);        }    if(ans==1e18){        printf("impossible");    }    else printf("%d",ans);
        return 0;}void flip(int i,char s[],int n){    s[i-1]=s[i-1]=='1'?'0':'1';    s[i]=s[i]=='1'?'0':'1';    if(i+1<n)s[i+1]=s[i+1]=='1'?'0':'1';}int min(int x,int y){    int a;    a=x>y?x:y;    return a;}

1 0