B 勝利大逃亡 續 bfs,狀態壓縮)

2021-08-01 13:28:58 字數 1316 閱讀 2765

ignatius再次被魔王抓走了(搞不懂他咋這麼討魔王喜歡)…… 

這次魔王汲取了上次的教訓,把ignatius關在乙個n*m的地牢裡,並在地牢的某些地方安裝了帶鎖的門,鑰匙藏在地牢另外的某些地方。剛開始ignatius被關在(sx,sy)的位置,離開地牢的門在(ex,ey)的位置。ignatius每分鐘只能從乙個座標走到相鄰四個座標中的其中乙個。魔王每t分鐘回地牢視察一次,若發現ignatius不在原位置便把他拎回去。經過若干次的嘗試,ignatius已畫出整個地牢的地圖。現在請你幫他計算能否再次成功逃亡。只要在魔王下次視察之前走到出口就算離開地牢,如果魔王回來的時候剛好走到出口或還未到出口都算逃亡失敗。 

input

每組測試資料的第一行有三個整數n,m,t(2<=n,m<=20,t>0)。接下來的n行m列為地牢的地圖,其中包括: 

. 代表路 

* 代表牆 

@ 代表ignatius的起始位置 

^ 代表地牢的出口 

a-j 代表帶鎖的門,對應的鑰匙分別為a-j 

a-j 代表鑰匙,對應的門分別為a-j 

每組測試資料之間有乙個空行。 

output

針對每組測試資料,如果可以成功逃亡,請輸出需要多少分鐘才能離開,如果不能則輸出-1。 

sample input

4 5 17

@a.b.

a*.*.

*..*^

c..b*

4 5 16

@a.b.

a*.*.

*..*^

c..b*

sample output

16-1這道題用乙個十進位制數將搜尋到每個點時擁有的鑰匙種類狀態壓縮,我反正理解這道題非常的快,原因就在於我之前學習了bitset優化。

#include#include#include#includeusing namespace std;

int n,m,t;

char chess[40][40];

int ex,ey;

int book[40][40][2000];

int next_[4][2]=,,,};

struct node

;int bfs()

}else if(chess[xx][yy]>='a' && chess[xx][yy]<='z')

}else}}

} }return 0;

}int main()

{ int i,j;

while(~scanf("%d%d%d",&n,&m,&t))

{ for(i=0;i>chess[i];

for(j=0;j

hdu1429勝利大逃亡 續 bfs 狀態壓縮

原先打算用乙個class裡面的set 儲存鑰匙,每次遇上門,就看當前結點的set有沒有對應的key 每次遇上鑰匙就將鑰匙插入的這個節點中,同時還要將父節點的鑰匙插入這個節點中,顯然這樣子很花費時間 於是考慮狀態壓縮,問題是怎麼壓縮?比如怎麼用二進位制儲存鑰匙 當走到 xx,yy 時 首先明確鑰匙只有...

勝利大逃亡 續 (簡單的深搜 狀態壓縮)

ignatius再次被魔王抓走了 搞不懂他咋這麼討魔王喜歡 output 針對每組測試資料,如果可以成功逃亡,請輸出需要多少分鐘才能離開,如果不能則輸出 1。sample input 4 5 17 a.b.a c b 4 5 16 a.b.a c b sample output 16 1 inclu...

hdu1429 勝利大逃亡 續 (廣搜 狀態壓縮)

是廣搜 狀態壓縮,狀態壓縮就是vis陣列加了乙個狀態表示這個狀態時來過沒,由二進位制01所代表的整數來表示,而狀態的表示由目前所擁有的鑰匙決定,這樣很容易就可以知道,遇到路就步數加一,狀態不變遇到鑰匙就改變狀態,遇到門就 一下看看有沒有鑰匙。自己要注意的是 想當然了,用了 include inclu...