8469 特殊密碼鎖

2021-09-21 16:05:27 字數 1479 閱讀 8469

總時間限制: 1000ms記憶體限制: 1024kb

描述

有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。

然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個按鈕。

當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。

輸入兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。

輸出至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。

樣例輸入1

011000

樣例輸出1

1樣例輸入2

111101

樣例輸出2

3樣例2說明:111--->001(按下第乙個)--->110(按下第二個)--->101(按下第三個)

演算法分析:列舉+貪心

參考 熄燈問題的講解

本題算是熄燈問題的簡化版。列舉第乙個按鈕是否按下的兩種情況即可。第乙個按鈕的操作情況確定以後,後面的事情都是確定的。

也即,當第乙個按鈕操作完成以後,從第二個開始掃瞄:若發現前乙個沒有達到目的狀態,只能通過操作當前按鈕去修改前乙個按鈕的狀態。以此類推,掃瞄完所有按鈕為止。

最後:檢驗最後面乙個按鈕是否達到目的狀態,若達到則該方案可以完成任務,但不一定是最優解(次數不一定是最小的。)因為第乙個按鈕的操作方案有兩種。

所以要對第乙個按鈕的兩種方案都做列舉求出各個方案對應的解,才能求最優解。

**:

1 #include2 #include

3int main(int argc, char *ar**)

425 i++;26}

27if(src[len-1]==target[len-1]) ans=count;

2829

//第二種方案:第乙個字元修改

30strcpy(src,temp);

31 i=0;//

i重新指向第乙個字元

32 src[i]=src[i]^1;33

if(i+1

1]=src[i+1]^1

;34 count=1

;35 i++;

36while(src[i]!='\0'

)3745 i++;46}

47if(src[len-1]==target[len-1]) ans=ansans:count;

4849

if(ans==1e9) printf("

impossible\n");

50else printf("

%d\n

",ans);

51return0;

52 }

可以參考:

8469 特殊密碼鎖

總時間限制 1000ms 記憶體限制 1024kb 描述有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個...

(列舉)8469 特殊密碼鎖

問題描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個按鈕。當前密碼鎖狀態已知,需要解決的問題是,你至...

OpenJudge 8469 特殊密碼鎖

中國mooc網,程式設計與演算法 二 第一周作業1 總時間限制 1000ms 記憶體限制 1024kb 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左...