HDU 1254 推箱子 (雙bfs)

2021-08-28 12:13:16 字數 1239 閱讀 8253

題幹:

推箱子是乙個很經典的遊戲.今天我們來玩乙個簡單版本.在乙個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
解題報告:

很久之前的一道bfs。參照了網上的思路,叫他雙bfs。就是同時進行兩個bfs。記錄狀態(結構體)和標記狀態(bool的陣列)的時候也是用四維陣列記錄。

先讓人動,如果人剛好走到箱子的位置,那麼箱子再動,這樣正好可以控制那個條件:箱子必須沿著人動的方向移動。

ac**:

#includeusing namespace std;

int maze[9][9],vis[9][9][9][9],n,m;

int nx[4][2]= ;

struct node

} st;

int bfs()

}} else if(vis[tx][ty][next.bx][next.by]==0)

}} q.pop();

} return -1;

}int main()

if(maze[i][j]==2)

}} st.step=0;

vis[st.x][st.y][st.bx][st.by]=1;

printf("%d\n",bfs());

} return 0;

}

HDU 1254 推箱子 雙層BFS

推箱子 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 推箱子是乙個很經典的遊戲.今天我們來玩乙個簡單版本.在乙個m n的房間裡有乙個箱子和乙個搬運工,搬運工的工作就是把...

HDU 1254 推箱子(雙重BFS)

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

hdu 1254 推箱子遊戲

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