1. 程式人生 > >001:特殊密碼鎖

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); }

這題 在第一個燈確定後後面的燈都確定了 故列舉 第一個燈 開和關;只有兩種情況。

    對於後面的燈來說想讓其關閉,只能關閉其下一個燈。因為不能影響前面的燈,而且要把目標燈關閉