網易筆試 推箱子

2021-08-28 18:47:58 字數 1911 閱讀 9425

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

輸入描述:

每個測試輸入包含1個測試用例

第一行輸入兩個數字n,m表示地圖的大小。其中0輸出描述:

輸出乙個數字表示玩家最少需要移動多少步才能將遊戲目標達成。當無論如何達成不了的時候,輸出-1。

輸入例子1:

4 4

....

..*@

....

.x..

6 6...#..

......

#*##..

..##.#

..x...

.@#...

輸出例子1:

3

11

基本方法:bfs搜尋,剪枝方法是使用乙個陣列儲存每一種狀態,如果某一種狀態在先前已經被經歷過了,則

這個狀態就直接拋棄。

#include#include#include#include#includeusing namespace std;

struct state

state update(int dx, int dy, vector>& map)

int n = map.size(), m = map[0].size();

if (s.px < 0 || s.px >= n || s.py < 0 || s.py >= m || s.bx < 0 || s.bx >= n || s.by < 0 || s.by >= m)

if (map[s.bx][s.by] == '#' || map[s.px][s.py] == '#')

return s;

}};int* setmap(vector>& map, int n, int m)

} }return index;

}void debug(vector>& map)

}int main()

; const int wy[4] = ;

int n, m;

cin >> n >> m;

vector> map(n, vector(m, 0));

int *where = setmap(map, n, m); //儲存初始玩家、初始箱子、終點位置

//狀態陣列

bool flag[10][10][10][10]; //true表示可訪問

//這裡使用memset筆試的編譯器會報錯,可以使用4層vector初始化

memset(flag, true, sizeof(flag));

queueque;

//初始化資料

flag[where[0]][where[1]][where[2]][where[3]] = false;

que.push(state(where[0], where[1], where[2], where[3]));

//bfs

while (!que.empty())

//向四個方向移動

for (int i = 0; i < 4; ++i)

}} cout << -1 << endl;

delete where;

system("pause");

return 0;

}

網易遊戲面試題 推箱子

時間限制 1秒 空間限制 32768k 大家一定玩過 推箱子 這個經典的遊戲。具體規則就是在乙個n m的地圖上,有1個玩家 1個箱子 1個目的地以及若干障礙,其餘是空地。玩家可以往上下左右4個方向移動,但是不能移動出地圖或者移動到障礙裡去。如果往這個方向移動推到了箱子,箱子也會按這個方向移動一格,當...

網易遊戲2016實習生招聘筆試題目 推箱子

對於輸入的狀態,找出玩家和箱子的位置,並使用座標記錄其位置,然後對於終端輸入的走法,依次判斷player按該走法一步一步的移動之後是否能夠成功。由於思路比較簡單,實際內容就是如何讓計算機模擬這個推箱子的過程。步驟也很簡單,只有上下左右移動,但是需要注意的是每次移動之前,需要對於題目描述的集中狀態和情...

網易2017內推筆試題

有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?輸入描述 每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 n 50 表示學生的...