hdu1429位運算狀態壓縮

2021-06-27 04:27:09 字數 863 閱讀 3297

第一次接觸位運算的狀態壓縮,這題本來我是用優先佇列寫的,用vector儲存鑰匙。本來以為會超時,沒想到是記憶體超限。無奈,找大神,發現正確姿勢是狀態壓縮。這題用來學

位運算的狀態壓縮是相當不錯,很好理解。題意是乙個人在乙個迷宮裡逃生,迷宮有鎖,有鑰匙,相應的鑰匙開相應的鎖。共有10種鎖。利用位運算就是把1當已經得到的鑰匙。比如得到了第一把則為0000000001,得到第十把則為1000000000.碰到鑰匙就收集key=key|(1<

一般的搜尋是vis.標記有沒有走過。但這個在一定情況下是可以回頭的。所以用了vis。第三維的下標就是收集鑰匙的狀態key。我是這麼理解的,當你沒有鑰匙的時候,你可以整張圖跑一遍,當你有一把鑰匙後,又可以跑一遍,因為可能有第乙個門。當你有第二把鑰匙,你又有權利跑一遍。總之就是,當你處於不同的狀態。就相當於整張圖是從來沒走過的。這樣,即能保證你再擁有相同鑰匙時,不至於走重複,也能讓你在擁有不同鑰匙時,訪問以前訪問過的點。**如下

#include#include#includeusing namespace std;

struct node

};char map[22][22];

int vis[22][22][5000];

int dir[4][2]=;

int n,m,t;

queueq;

bool bfs()

}if(map[next.x][next.y]>='a'&&map[next.x][next.y]<='j')

}else}}

}} }

return 0;

}int main()

int starx,stary;

for(int i=0;i

優先佇列部分沒用 可忽略

Hdu 1429(狀態壓縮)

有鑰匙和門的 bfs 狀態壓縮 乙個十把鑰匙和鎖,分別為a,b.j 當所用的步數小於 t即可。include include include includeusing namespace std int n,m,t,ans char map 21 21 int dir 4 2 int vis 21 ...

hdu1429(廣搜 狀態壓縮(位壓縮))

一開始用廣搜來做,超記憶體了,然後參照網上的資料,用位壓縮來做,頭一次做這種題,但個人感覺還是很好理解的,稍微看了一下就懂了,然後自己寫了個程式。思路 乙個有10把鑰匙,用10個位來表示,例如100 4 表示只有第三把鑰匙,1100 12 表示有第三四把鑰匙。如下 include include i...

hdu 1429 典型的狀態壓縮

原 題目中文的,意思在不懂,我只能說 苟。好了,不扯沒用的了,直接貼 吧。乍一看很有意思,因為用二進位制的方法來記錄鑰匙與門的匹配,不太常見,其實是典型的狀態壓縮的題目,可以一試。其實就是紫書上現學現賣的。include include includeusing namespace std int ...