推箱子
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
1sample output5 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
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...