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