2018 10 03 迷宮遊戲(狀壓 bfs)

2021-08-28 16:44:01 字數 2322 閱讀 8237

描述

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...