題解 特殊密碼鎖

2021-09-25 15:25:37 字數 1291 閱讀 6142

描述

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

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

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

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

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

樣例輸入

011

000

樣例輸出
1
這道題與熄燈問題很相似。

鎖的狀態也是有限的,即開和閉;因此對同樣乙個鎖按三次與不按是同樣的效果。那麼對於鎖只有就只有兩種操作:與目標相同就不翻轉,不相同就翻轉。

由於翻轉會導致前後鎖也被翻轉,只要前乙個鎖的狀態確定了,它後乙個鎖的狀態也就確定了。根據第一條,我們可以根據這後乙個鎖的狀態來決定後乙個鎖的下乙個鎖的操作與否。

操作的順序對於結果沒有影響。

那麼思路就很清晰了:通過列舉來決定第乙個鎖的情況(翻轉或者不翻轉),再對每一位進行判斷,比較它們與目標位來決定是否翻轉。如果遍歷過後原狀態已經達到目標狀態,就得到了結果;否則次數清0,重新計算。如果兩種情況都不行,就輸出impossible。

#include

#include

using

namespace std;

void

flipbit

(string & c,

int j)

intmain()

if(result[i]

!= goal[i]

)// 不相等說明下一位還要翻轉

ischange =

true

;else

ischange =

false;}

if(result[length -1]

!= goal[length -1]

)// 最後一位不同的話說明這種情況不行,重新計算次數

times =0;

else

break;}

if(times)

cout << times << endl;

else

cout <<

"impossible"

<< endl;

return0;

}

特殊密碼鎖

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

特殊密碼鎖

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

特殊密碼鎖

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