有n
nn個房間, m
mm個傳送門,k
kk種鑰匙,每個房間有一些鑰匙,每個傳送門可以從乙個房間傳到另乙個房間,需要一定的鑰匙才能使用傳送門,求出經過最少的傳送門能從1
11號房間到達n
nn號房間。
壓縮鑰匙的狀態,然後bfs
bfsbf
s就行了。
#include
#include
#include
#include
using
namespace std;
struct nodee[
6001];
struct state
;int n, m, k, ans, x;
int key[
5001
], list[
5001
], d[
2048][
5001];
void
bfs())
;memset
(d,-1,
sizeof
(d))
; d[key[1]
][1]
=0;while
(q.size()
)); d[s | key[y]
][y]
= d[s]
[head.w]+1
;}}if
(head.w == n) ans =
min(ans, d[head.k]
[n]);}
}int
main()
}for
(int i =
1; i <= m; i++)}
ans =
2147483647
;bfs()
;if(ans ==
2147483647
)printf
("no solution");
else
printf
("%d"
, ans)
;}
狀態壓縮 廣度優先搜尋 迷宮遊戲
題目描述 pluto 已經很久沒有玩遊戲了,今天 pluto 難得能夠歇一天。於是,pluto 決定要玩乙個非常好玩的迷宮遊戲。這個迷宮遊戲在乙個 n 行 m 列的矩陣上進行,遊戲中的任意時刻不能走出這個矩陣。在這個矩陣中,有下列幾種元素 表示一塊平地。x 表示一堵牆,不能經過。s 表示遊戲的起點,...
交換遊戲 狀態壓縮 記憶化搜尋
題目描述 一列上有12個孔,這12個孔中有些孔被遮擋住了。假定我們用 來表示沒被遮擋住的孔,用 o 來表示被遮擋住的孔。如果相鄰的三個孔有兩個孔被遮擋,並且被遮擋的兩個孔相鄰,就是 oo 和 oo 對於這樣的三個孔,我們可以將中間的孔的遮擋物移開,代價是將一端的遮擋物移到另一端沒有被遮擋的孔上面。對...
百練 4124 狀態壓縮 記憶化搜尋
傳送門 題意就不說了.題目要求是一定是從標號1出發,最後到達標號n,中間不重複的經過完其他島.那麼問題就是如何搜尋.中間有14個點,那麼最壞的情況就是14 中情況,這樣肯定是會超時的.所以我們需要剪枝,因為我們可以發現中途到達某個點時,如果此時的深度大於了曾經經過的點的深度或者目標點的深度,那麼直接...