思路: 20張牌 有1>>20中情況 用二進位制標記, 這道題的關鍵地方就是怎樣無翻牌 這裡用到位運算 1^x 若x為0 則為1 否則為0 這裡正好用到翻牌 對前兩張和後兩張 都可以和3(11)進行異或運算 對中間的和7(111) 進行異或運算
#include#include#include#includeusing namespacestd;int
mark[1<<20],leap[20],num[20],step[1<<20],n;int
bfs() memset(mark,0,sizeof
(
mark));memset(step,-1,sizeof
(
leap));mark[a]=1;step[a]=0;queue<int>
q;q.push(a);while
(!
q.empty())}}return
0;}int
main
()return
0;}
hdu1429(廣搜 狀態壓縮(位壓縮))
一開始用廣搜來做,超記憶體了,然後參照網上的資料,用位壓縮來做,頭一次做這種題,但個人感覺還是很好理解的,稍微看了一下就懂了,然後自己寫了個程式。思路 乙個有10把鑰匙,用10個位來表示,例如100 4 表示只有第三把鑰匙,1100 12 表示有第三四把鑰匙。如下 include include i...
hdu 2209 BFS 狀態壓縮
這題bfs是比較簡單,但是就是在狀態壓縮和那個翻牌的操作就蛋疼了。開始的時候暴力。華麗麗的超時了。最後看了別人的思路,才恍然大悟。這題 因為翻牌是0變1,1變0,所以可以通過異或來實現,而每一位的翻牌操作,只需要事前把用來異或的數算出來儲存就行,如下 handle 1 3 handle length...
hdu 5094 Maze 狀態壓縮dp 廣搜
使用廣度優先搜尋,dp key x y 表示在擁有鑰匙key並在座標 x,y 時需要的最少的步數,key的二進位制的第i位等於1則代表擁有第i把鑰匙。需要注意以下幾點 1.可能存在同一座標有多把鑰匙。2.牆和門是在兩個座標間進行移動時的障礙,並不在座標點上,因此兩個方向的移動都要加入wall陣列。2...