1. 程式人生 > >網易筆試題:推箱子

網易筆試題:推箱子

左右 esp 一行 else HA 經典的遊戲 clas 不能 box

大家一定玩過“推箱子”這個經典的遊戲。具體規則就是在一個N*M的地圖上,有1個玩家、1個箱子、1個目的地以及若幹障礙,其余是空地。玩家可以往上下左右4個方向移動,但是不能移動出地圖或者移動到障礙裏去。如果往這個方向移動推到了箱子,箱子也會按這個方向移動一格,當然,箱子也不能被推出地圖或推到障礙裏。當箱子被推到目的地以後,遊戲目標達成。現在告訴你遊戲開始是初始的地圖布局,請你求出玩家最少需要移動多少步才能夠將遊戲目標達成。

輸入描述:
每個測試輸入包含1個測試用例
第一行輸入兩個數字N,M表示地圖的大小。其中0<N,M<=8。
接下來有N行,每行包含M個字符表示該行地圖。其中 . 表示空地、X表示玩家、*表示箱子、#表示障礙、@表示目的地。
每個地圖必定包含1個玩家、1個箱子、1個目的地。
輸出描述:
輸出一個數字表示玩家最少需要移動多少步才能將遊戲目標達成。當無論如何達成不了的時候,輸出-1。
輸入例子1:
4 4
....
..*@
....
.X..
6 6
...#..
......
#*##..
..##.#
..X...
.@#...

輸出例子1:
3
11

思路:BFS,用一個隊列記錄下每一步人和箱子的位置,實現BFS遍歷,用一個四維數組記錄下遍歷過的點和到達這點時走過的步數,以後不再遍歷,最後隊列為空即無法到達,輸出-1

 1 #include<iostream>
 2 #include<vector>
 3
#include<queue> 4 using namespace std; 5 class State 6 { 7 public: 8 State(int humanX=0, int humanY=0, int boxX=0, int boxY=0) 9 : human_x(humanX) 10 , human_y(humanY) 11 , box_x(boxX) 12 , box_y(boxY) 13 { 14 } 15 int human_x; 16 int human_y;
17 int box_x; 18 int box_y; 19 }; 20 int main() 21 { 22 int N, M; 23 cin>>N>>M; 24 vector<vector<char>> map(N, vector<char>(M, 0)); 25 int human_x, human_y, box_x, box_y; 26 int end_x, end_y; 27 for(int i=0; i<N; ++i) 28 { 29 for(int j=0; j<M; ++j) 30 { 31 cin>>map[i][j]; 32 if(map[i][j]==X) 33 { 34 human_x=i; 35 human_y=j; 36 }else if(map[i][j]==*){ 37 box_x=i; 38 box_y=j; 39 }else if(map[i][j]==@){ 40 end_x=i; 41 end_y=j; 42 } 43 } 44 } 45 queue<State> que; 46 que.push(State(human_x, human_y, box_x, box_y)); 47 int count[9][9][9][9]={0}; 48 int stepX[4]={1, -1, 0, 0}; 49 int stepY[4]={0, 0, 1, -1}; 50 while(que.size()) 51 { 52 State cur=que.front(); 53 que.pop(); 54 if(cur.box_x==end_x && cur.box_y==end_y){ 55 cout<<count[cur.human_x][cur.human_y][cur.box_x][cur.box_y]<<endl; 56 return 0; 57 } 58 for(int i=0; i<4; ++i) 59 { 60 State next=cur; 61 next.human_x+=stepX[i]; 62 next.human_y+=stepY[i]; 63 if(next.human_x<0 || next.human_x>=N || next.human_y<0 || next.human_y>=M || map[next.human_x][next.human_y]==#)continue; 64 if(next.human_x==next.box_x && next.human_y==next.box_y){//如果人走到了箱子的位置,那麽箱子也按人走的方向移動 65 next.box_x+=stepX[i]; 66 next.box_y+=stepY[i]; 67 if(next.box_x<0 || next.box_x>=N || next.box_y<0 || next.box_y>=M || map[next.box_x][next.box_y]==#)continue; 68 } 69 if(count[next.human_x][next.human_y][next.box_x][next.box_y])continue;//如果之前遍歷過,則不再遍歷 70 count[next.human_x][next.human_y][next.box_x][next.box_y]=count[cur.human_x][cur.human_y][cur.box_x][cur.box_y]+1; 71 que.push(next); 72 } 73 } 74 cout<<-1<<endl; 75 return 0; 76 }

網易筆試題:推箱子