描述
pluto 已經很久沒有玩遊戲了,今天 pluto 難得能夠歇一天。於是,pluto 決定要玩乙個非常好玩的迷宮遊戲。這個迷宮遊戲在乙個 n 行 m 列的矩陣上進行,遊戲中的任意時刻不能走出這個矩陣。在這個矩陣中,有下列幾種元素:
. :表示一塊平地。
x :表示一堵牆,不能經過。
s :表示遊戲的起點,有且僅有乙個。
t :表示遊戲的終點,有且僅有乙個。
a~h :表示一種型別的門,每種型別的門最多隻會出現一次。
a~h :表示每種型別的門對應的鑰匙,每種型別的鑰匙最多隻會出現一次,並且保證只會與對應型別的門同時出現。
在這個遊戲中,玩家從起點開始,每次向上下左右中的乙個方向移動一格,若發生下列任意一種或多種情形,則該步移動不合法,遊戲退出。
1 . 走出矩陣。
2 . 移動後的格仔中是牆。
3 . 移動後的格仔中是門,且還未獲得對應的鑰匙。
若玩家走到乙個有鑰匙的格仔中,則玩家將獲得格仔中的鑰匙(注意:玩家不能選擇放棄獲取。)最終,若玩家到達終點,則遊戲完成。
現在,pluto 希望你能幫助他在完成遊戲的同時,獲得盡量少的鑰匙。如果有多解,請輸出任意一解。
輸入第一行兩個正整數 n,m,表示矩陣的大小。
接下來乙個 n*m 的矩陣,描述這個迷宮。
輸出一共若干字元,表示你的操作序列。『u』表示向上,『d』表示向下,『l』表示向 左,『r』表示向右。(注意:輸出的操作序列需保證長度不超過 10000000。
樣例輸入
3 4s.a.
.x.x
atx.
樣例輸出
rrllddr
提示對於 50%的資料,2 ≤ n,m ≤ 100。
對於 100%的資料,2 ≤ n,m ≤ 200
狀壓搜尋經典題。
解法:定義當前狀態:(x,
y,st
ate)
(x,y,state)
(x,y,s
tate
)表示當前在x行y列,鑰匙的獲得狀態是state(二進位制壓縮)。
其實就是普通的bfs加上狀壓表示。
由於題目要求選最小的鑰匙,所以這題可能會從隊頭和隊尾兩端插入節點,因此如果用stl需要用雙端佇列,手寫雙端的話空間無法承受,因此最好迴圈佇列。
**:
#include
using
namespace std;
const
int lop=
205*
205*(1
<<8)
+1;int n,m,sx,sy,tx,ty,dx[4]
=,dy[4]
=;struct nodepre[
205]
[205][
(1<<8)
+5],q[lop]
;char mp[
205]
[205
],s[
205]
,ans[lop]
;bool vis[
205]
[205][
(1<<8)
+5];
inline
void
print
(int x,
int y,
int s)
for(
int i=cnt;i;
--i)
putchar
(ans[i]);
}inline
void
bfs(
),vis[sx]
[sy][0
]=1;
while
(hd<=tl)
for(
int i=
0;i<4;
++i);if
(tmp)pos=
(--hd)
%lop;
else pos=
(++tl)
%lop;
q[pos]
=(node);}
else
if(mp[mx]
[my]
>=
'a'&&mp[mx]
[my]
<=
'z')
; pos=
(--hd)
%lop,q[pos]
=(node);}
else
; pos=
(--hd)
%lop,q[pos]
=(node);}
}}}int
main()
}bfs()
;return0;
}
codevs1358棋盤遊戲 狀壓dp
時間限制 1 s 空間限制 64000 kb 題目等級 大師 master 這個遊戲在乙個有10 10個格仔的棋盤上進行,初始時棋子位於左上角,終點為右下角,棋盤上每個格仔內有乙個0到9的數字,每次棋子可以往右方或下方的相鄰格仔移動,求一條經過數字之和最小且經過0到9的所有數字的合法路徑,輸出其長度...
hiho 1271 艦隊遊戲 狀壓dp 貪心 模擬
簡要題意 給定對空和對艦的飛機還有乙個航母,給定計算公式,要你弄個奇怪的方案。題意非常扭曲,但是的確算是個好題吧。對於30 的資料,可以進行搜尋,列舉每個位置放哪個飛機。對於大資料可以採用狀壓dp的方式。最多16 個位置,狀態空間為216 由於題目中的限制,你無法直接去算整個結果。可以分別計算兩邊的...
狀壓DP例題(種花小遊戲 廣場鋪磚)
狀態壓縮其實就是用特殊的方法來表示複雜的狀態做dp,這種特殊的方法一般是位運算。例題一 種花小遊戲 dpi j i可以拆分成二進位制數,每一位上的0或1表示是否走過,j表示當前位置。include using namespace std const double maxn 200000000.0 d...