MOOC 001 特殊密碼鎖

2021-10-03 07:25:22 字數 1304 閱讀 1995

首先應該想到熄燈問題,熄燈問題是使列舉簡單化,找到唯一的一種情況列舉。此題目與熄燈問題相似,只要按下搜尋到的與目標密碼不同密碼的後一位密碼即可,這樣便可以連帶改變搜尋到的那一位密碼,當遍歷後只需比較最後一位密碼即可,相同則輸出

1010

0000

第一位不同,則要改變第二位密碼,連帶將第一位也轉變

即0100

0000

0011

0000

就這樣依次搜尋

也有特殊的情況

比如110

000如果再像剛才那樣搜尋得到的結果就是inpossible,這就需要按下第一位密碼然後再遍歷

#include

#include

#include

using namespace std;

void setbit(int &a,int i,int v)

int getbit(int a,int i)

void flip(int & a, int i)

int main(

) if(getbit(process,i)

!= getbit(zero,i))

curbutton = 1;

else

curbutton = 0;

} if(getbit(process,n-1)

==getbit(zero,n-1))

//由於資料型別是整型,不能直接比較大小 }

if(m==0)

return 0;

}

二進位制中的列舉法自然少不了位運算,

a |= ( 1 << i) a &= ~( 1 << i)

(a >> i) & 1 a ^= ( 1 << i)

以上是位運算中常用的幾種處理方法

int型別佔4位元組,即32位,題目中說n<30,這樣用int型別儲存密碼剛剛好(char型別佔1位元組)

資料輸入時是用的char型別,setbit(start,i,line[i]-『0』);通過**-『0』**的方式來變為int型別,從而便於進行位運算

**if(getbit(process,n-1)==getbit(zero,n-1))**這裡不能直接比較,因為process,zero都是int型別,而且都是極小的數就相當於0與0比較,結果顯然相等並沒有什麼意義

輸出的時候引入了新的變數m,是為了輸出結果的時候不會因p的那層迴圈而出現多重輸出的情況

001特殊密碼鎖

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

001 特殊密碼鎖(貪心)

這道題不難,可以列舉來寫,每個鎖兩種狀態一共30個鎖2 30的複雜度可能不會超,在此提供另外一種貪心的思路。對於第乙個鎖,我們列舉 好吧算不上列舉 開或不開兩種情況。如果第乙個鎖不為目標狀態,那麼只有第二個鎖才能關掉它。依次類推,如果第i個鎖不為目標狀態,那麼只有第i 1個鎖才能關掉它 最後,我們只...

特殊密碼鎖

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