HDU 1254 推箱子(雙重BFS)

2021-07-25 07:48:52 字數 1746 閱讀 9649

不錯的搜尋題 ^^

分析:需要判斷人和箱子的相對位置,兩個bfs巢狀,挪動一次箱子就判斷一次人是否能到達使箱子挪動的地方。兩次bfs,因為資料量不大,所以應該可以過

很棒的搜尋題

需要注意的地方:

1.人不能穿過箱子,所以每次在處理人的行進路徑時需要把地圖g中箱子處轉換成1

2.箱子不一定沿著到達目標點的最短路徑前進

3.需要開4維陣列記錄人和箱子的相對狀態state,因為人在箱子4個方向是不同的狀態會產生不同的後繼狀態,因此需要標記

**:

/* 

note:

一開始想把問題分解成兩個子問題

1.用bfs找到最短路記錄下路徑 2.dfs判斷人能否到達路徑中每個點的前乙個狀態(即合法推箱子的狀態)

後來發現有嚴重問題

例如:

1 7 6

4 1 1 1 1 1

0 1 0 0 0 1

0 1 0 1 0 1

0 2 0 1 0 3

0 0 0 1 0 1

0 0 0 0 0 1

0 0 0 0 0 1

我的思路只能選擇兩條最優路徑中一條,然後進行判斷,如果選擇上面一條,那肯定是不對的,最合理的方法是選擇下面的路徑

所以這個思路是必錯無疑

挪動一次箱子就判斷一次人是否能到達使箱子挪動的地方

兩次bfs,因為資料量不大,所以應該可以過

*/

#include#include#includeusing namespace std;

//#define test

int n,m;

int g[10][10];

int vis[10][10];

int state[9][9][9][9]; // 記錄箱子和人的相對狀態

int box_x,box_y,per_x,per_y,x_e,y_e; // box person x 的位置

const int dx=;

const int dy=;

struct point;

struct node;

bool check_per(int x,int y)

bool judge_per(int x_s,int y_s,int x_e,int y_e)

int judge_box()

state[cur.per.x][cur.per.y][cur.box.x][cur.box.y]=1;

q.push(cur);

while(!q.empty())

if(ok)

} }

}

}

return -1;

}

int main()

}

if(!ok) // 能到達箱子周圍讓person的位置更新一下即可

}

g[box_x][box_y]=0;

}

if(!ok)

memset(state,0,sizeof(state));

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

}

return 0;

}

HDU 1254 推箱子 雙層BFS

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

HDU 1254 推箱子 (雙bfs)

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

hdu 1254 推箱子遊戲

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