OlineJudge 8469 特殊密碼鎖

2021-10-18 19:21:23 字數 1819 閱讀 6370

描述

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

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

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

輸入

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

輸出

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

樣例輸入

011000

樣例輸出

1思路

因為按動乙個會影響前面的,所以當前面的部分和目標狀態相同時,出現不同的乙個,不能按動此按鈕,如果按動會造成其前乙個按鈕狀態改變,因此出現不同的,只能按動不同的這個的後面乙個按鈕。也就是說,當第乙個按鈕確定了,後面所有的操作都已經確定了。

另外,乙個被按動,左右按鈕狀態都會被改變,而第乙個按鈕,只會使它自己和右邊的狀態改變。因此我們可以分兩種情況,即按動第乙個和不按動第乙個。求出兩種情況操作次數最少的。

每個位置的按鈕的狀態可以通過它後面乙個按鈕來修改,而最後乙個按鈕無法修改。所有我們要判斷是否成立,只需判斷修改後最後乙個按鈕狀態是否和目標狀態相同。

注意不是第乙個按鈕當前和目標不一樣才能按動,一樣也可以按動,第乙個的狀態可以通過第二個按鈕來改變。當按動第乙個按鈕時,注意修改它本身和第二個按鈕。當其他位置出現不同時,需要修改它後面兩個的狀態。

**

#include

#include

using

namespace std;

string obj,ori,tep;

int cnt1,cnt2,n;

void

flip

(int i)

//改變按鈕狀態

intcheck()

}if(tep[n-2]

!=obj[n-2]

)//防止陣列越界 單獨判斷倒數第二個

if(tep[n-1]

!=obj[n-1]

)//前面的已經確定,最後乙個不能更改

cnt=

1e5;

//若最後乙個不同,則該方案不可行

return cnt;

}int

main()

tep=ori;

//複製初始狀態

cnt1++

;flip(1

);//改變第二個

flip(0

);//改變第乙個

cnt1+

=check()

;//第一種情況

tep=ori;

//恢復初始狀態

cnt2=

check()

;//第二種情況

int ans=

1e5;

//答案輸出

ans=

min(ans,cnt1)

; ans=

min(ans,cnt2);if

(ans<

100)

cout

cout<<

"impossible"

;return0;

}

8469 特殊密碼鎖

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

8469 特殊密碼鎖

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

(列舉)8469 特殊密碼鎖

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