HDU 1254 推箱子 雙層BFS

2021-07-15 13:43:02 字數 1789 閱讀 7195

推箱子

time limit:1000msmemory limit:32768kb64bit io format:%i64d & %i64u

submit

status

description

推箱子是乙個很經典的遊戲.今天我們來玩乙個簡單版本.在乙個m*n的房間裡有乙個箱子和乙個搬運工,搬運工的工作就是把箱子推到指定的位置,注意,搬運工只能推箱子而不能拉箱子,因此如果箱子被推到乙個角上(如圖2)那麼箱子就不能再被移動了,如果箱子被推到一面牆上,那麼箱子只能沿著牆移動.

現在給定房間的結構,箱子的位置,搬運工的位置和箱子要被推去的位置,請你計算出搬運工至少要推動箱子多少格.

input

輸入資料的第一行是乙個整數t(1<=t<=20),代表測試資料的數量.然後是t組測試資料,每組測試資料的第一行是兩個正整數m,n(2<=m,n<=7),代表房間的大小,然後是乙個m行n列的矩陣,代表房間的布局,其中0代表空的地板,1代表牆,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬運工的起始位置.

output

對於每組測試資料,輸出搬運工最少需要推動箱子多少格才能幫箱子推到指定位置,如果不能推到指定位置則輸出-1.

sample input

1

5 50 3 0 0 0

1 0 1 4 0

0 0 1 0 0

1 0 2 0 0

0 0 0 0 0

sample output

4 

思路:

分成2部分 ,首先bfs 搜尋箱子能夠移動到的地方 然後對人進行bfs 看人是否能走到箱子邊上 並且讓箱子移動到新的位置  

用vis[30][30][30][30]去標記 當人在某個位置箱子在某個位置時的狀態 

ac**:0ms

#include#include#include#include#include#includeusing namespace std;

bool pvis[30][30],bvis[30][30],vis[30][30][30][30];//四維 前2維是箱子的位置 後2維是人的位置 表示在人在某個位置而箱子在某個位置這個狀態是否走過

int map[30][30];

int n,m;

int dir[4][2]=,,, };//這個思路,在這裡不要用這組方向dir[4][2]=,,, };無限wa了將近十次,最後改了這裡居然過了

,現在我也不知道為何,等以後知道了再來修改,要是哪位大神知道為何不能用這組方向求指教。謝謝了

struct personpq,ptemp;

struct boxq,temp;

bool pok(int xx,int yy)

int p_bfs(int x,int y,int fx)//x  y是 推動後箱子的位置}}

return 0;

} bool ok(int xx,int yy)

void bfs()

for(int i=0;i<4;i++)}}

}printf("-1\n");

} int main()

{ int t;

scanf("%d",&t);

while(t--)

{memset(vis,0,sizeof(vis));

scanf("%d %d",&n,&m);

for(int i=0;i

HDU 1254 推箱子(雙重BFS)

不錯的搜尋題 分析 需要判斷人和箱子的相對位置,兩個bfs巢狀,挪動一次箱子就判斷一次人是否能到達使箱子挪動的地方。兩次bfs,因為資料量不大,所以應該可以過 很棒的搜尋題 需要注意的地方 1.人不能穿過箱子,所以每次在處理人的行進路徑時需要把地圖g中箱子處轉換成1 2.箱子不一定沿著到達目標點的最...

HDU 1254 推箱子 (雙bfs)

題幹 推箱子是乙個很經典的遊戲.今天我們來玩乙個簡單版本.在乙個m n的房間裡有乙個箱子和乙個搬運工,搬運工的工作就是把箱子推到指定的位置,注意,搬運工只能推箱子而不能拉箱子,因此如果箱子被推到乙個角上 如圖2 那麼箱子就不能再被移動了,如果箱子被推到一面牆上,那麼箱子只能沿著牆移動.現在給定房間的...

hdu 1254 推箱子遊戲

這個題目我就不說,鏈結在這裡 主要我想說的是,一開始是我用2個三圍陣列來分別標記人和箱子走過的四個方向,但不知怎麼回事行不通。於是就用乙個四維陣列來標記狀態,嘻嘻,過了。好吧,還是直接上 了。1 include2 include3 include4 5using namespace std 6int...