C 列舉 特殊密碼鎖

2021-10-01 01:38:22 字數 1676 閱讀 2432

1.題目

001:特殊密碼鎖

檢視 提交 統計 提問

總時間限制: 1000ms 記憶體限制: 1024kb

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

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

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

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

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

樣例輸入

011000

樣例輸出

1

2.**一(tle**)

#include#include#include#includeint s1[32];

int s2[32];

int press[32];

int status[32];

char ss1[32];

char ss2[32];

using namespace std;

int main()

cin>>ss1;

cin>>ss2;

int n=strlen(ss1);

int len=n+1;

int flag=0;

int ans=0;

for(int i=0;i這份**是按照熄燈問題的思路解的,根據字串的長度n列舉了2^n種按法。

3.**二

#include#include#include#include//#includechar ss1[34];

char ss2[34];

char ss3[34];

char ss4[34];

using namespace std;

char re(char x)

int main()

cin>>ss1;

cin>>ss2;

strcpy(ss3,ss1);

strcpy(ss4,ss2);

int n=strlen(ss1);

int ans1=0,ans2=0;

int num1=0,num2=0;

int i=0;

while(i0||num2>0)

{if(num1>num2)

{if(num2!=0)

{cout{

if(num1!=0)

{cout<4.思路分析

首先列舉2^32種方案會超時。所以只能換種思路來解決。我們可以使用一種貪心的策略,始終保證左邊的序列與目標序列一致,這樣我們只需要調整下一位使得左邊的序列與目標一致。因為密碼鎖調整的次序和次數都不會影響結果。按3次相當於按一次。

因此存在兩種情況:1.每次調整後一位使得序列相符。2.對於第一位來說,因為不存在左邊的序列,因此也可以調節。所以第一位也反轉一次。這是兩種情況,都需要考慮。然後看那種情況可以達成目標或者反轉次數最少。我做題的時候,犯了乙個錯誤,以為只有當第一位不同的時候,才需要考慮反轉第一位。但是其實,無論是否相同,都需要。反轉了第一位,使得1 2位都反轉,這樣當第一位不同的時候,反轉後一位,只會影響第三位。

(列舉)8469 特殊密碼鎖

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

特殊密碼鎖

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

特殊密碼鎖

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