不錯的搜尋題 ^^
分析:需要判斷人和箱子的相對位置,兩個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...