大家一定玩過「推箱子」這個經典的遊戲。具體規則就是在乙個n*m的地圖上,有1個玩家、1個箱子、1個目的地以及若干障礙,其餘是空地。玩家可以往上下左右4個方向移動,但是不能移動出地圖或者移動到障礙裡去。如果往這個方向移動推到了箱子,箱子也會按這個方向移動一格,當然,箱子也不能被推出地圖或推到障礙裡。當箱子被推到目的地以後,遊戲目標達成。現在告訴你遊戲開始是初始的地圖布局,請你求出玩家最少需要移動多少步才能夠將遊戲目標達成。
輸入描述:
輸入例子1:每個測試輸入包含1個測試用例
第一行輸入兩個數字n,m表示地圖的大小。其中0輸出描述:
輸出乙個數字表示玩家最少需要移動多少步才能將遊戲目標達成。當無論如何達成不了的時候,輸出-1。
輸出例子1:4 4
....
..*@
....
.x..
6 6...#..
......
#*##..
..##.#
..x...
.@#...
基本方法:bfs搜尋,剪枝方法是使用乙個陣列儲存每一種狀態,如果某一種狀態在先前已經被經歷過了,則3
11
這個狀態就直接拋棄。
#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 表示學生的...