原題oj鏈結
有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個按鈕。當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
011
000
1
貪心
乙個燈如果按了第二下,就會抵消上一次按下所產生的影響。
因此,乙個燈只有按或者不按兩種情況,不存在乙個燈要開關多次的情況。
例如八個燈 00000000
按1後 11000000
按3後 10110000
按1後 01110000
這和八個燈 00000000
只按一次3後 01110000
是完全相同的情況
我們只需要考慮是否按下第乙個燈。因為如果第乙個燈的狀態被確定了,那麼是否按下第二個燈也就決定了(如果第乙個燈與期望不同,則按下,如果期望相同,則不按下)同理,第三個燈是否按下也唯一確定。所以,本題只要分兩種情況:燈1被按下和沒有被按下之後使用for迴圈判斷別的燈是否需要按下即可當迴圈結束,若現在的燈況與答案相同,則輸出兩種方案中按鍵次數最少的,若不同,則impossible!
#include
#include
#include
using
namespace
std;
string lockin,lockout;
int l1[35],l2[35],l3[35];
int main()
//不按第一把鎖
for(int i=1;iif(l1[i-1]!=l2[i-1])
}//按第一把鎖
l3[0]^=1;
l3[1]^=1;
num2++;
for(int i=1;iif(l3[i-1]!=l2[i-1])
}int flag1=1,flag2=1;
for(int i=0;iif(l1[i]!=l2[i])
if(l3[i]!=l2[i])
}if(flag1==-1 && flag2==-1)
參考:
OpenJudge 8469 特殊密碼鎖
中國mooc網,程式設計與演算法 二 第一周作業1 總時間限制 1000ms 記憶體限制 1024kb 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左...
8469 特殊密碼鎖
總時間限制 1000ms 記憶體限制 1024kb 描述有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個...
8469 特殊密碼鎖
總時間限制 1000ms記憶體限制 1024kb 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個...