首先應該想到熄燈問題,熄燈問題是使列舉簡單化,找到唯一的一種情況列舉。此題目與熄燈問題相似,只要按下搜尋到的與目標密碼不同密碼的後一位密碼即可,這樣便可以連帶改變搜尋到的那一位密碼,當遍歷後只需比較最後一位密碼即可,相同則輸出
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 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個按鈕。當前密碼鎖狀態已知,需要解決的問題是,你至少需要按...