演算法實踐 特殊密碼鎖(列舉,貪心)

2021-10-03 08:27:46 字數 1984 閱讀 6305

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

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

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

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

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

011

000

1
high 列舉的方法和輸出的最少次數需要考慮,採用貪心演算法求解

乙個按鈕按兩下相當於沒按, 按三下相當於按一下。

按下乙個按鈕保證前面的燈都是符合期望狀態,列舉到最後一盞燈如果也可以符合期望狀態,即可以實現轉變。

列舉第乙個按鈕的開關,優先順序是第乙個按鈕沒按,然後從第二個按鈕到最後乙個按鈕,採用貪心演算法,滿足前面乙個按鈕的狀態。

def

reverse

(i):

if i ==

'0':

return

'1'elif i==

'1':

return

'0'#改變鎖的狀態

deflock_changed

(input_data,i)

: input_data[i]

=reverse(input_data[i])if

(i-1

>=0)

: input_data[i-1]

=reverse(input_data[i-1]

)if(i+1

<=

len(input_data)-1

):input_data[i+1]

=reverse(input_data[i+1]

)issuccess =

false

input_status =

input()

final_status =

input()

input_status1 =

list

(input_status)

input_status2 =

list

(input_status)

final_status =

list

(final_status)

count1 =

0#第乙個按鈕未按下

for i in

range(1

,len

(input_status1)):

if(input_status1[i-1]

!=final_status[i-1]

):count1+=

1 lock_changed(input_status1,i)

count2 =

1#第乙個按鈕按下

lock_changed(input_status2,0)

for i in

range(1

,len

(input_status2)):

if(input_status2[i-1]

!=final_status[i-1]

):count2+=

1 lock_changed(input_status2,i)

if(input_status1 == final_status)

:print

(count1)

elif

(input_status2 == final_status)

:print

(count2)

else

:print

("impossible"

)

貪心演算法 特殊密碼鎖

1.cpp created on 2017年8月30日 author administrator include include include using namespace std string result,s,lock int temp 0 answer 1e9,n void press i...

C 列舉 特殊密碼鎖

1.題目 001 特殊密碼鎖 檢視 提交 統計 提問 總時間限制 1000ms 記憶體限制 1024kb 描述有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的...

(列舉)8469 特殊密碼鎖

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