2018.3.19
此題我用了廣度優先搜尋(bfs)的方法.廣度優先搜尋不僅僅可以使用在圖的遍歷中,而且可以用於求解複雜問題的最優解。
本題就是利用bfs的經典題目,首先來分析這個問題:
查詢空間:所有(0,0,0)到點(a-1,b-1,c-1)合法的行走路徑
查詢目標:找到通往出口的最短路徑
查詢方法:將人物的三維位置座標以及所花費的時間作為乙個四元組(x,y,z,t),這就把查詢所有路徑轉化成了對狀態的搜尋,即查詢(a-1,b-1,c-1,t),對於具體的某一狀態,可以通過擴充套件狀態來遍歷查詢所有之後的狀態,比如(x,y,z,t)在沒有障礙物的情況下可以擴充套件為(x+1,y,z,t+1)(x-1,y,z,t+1)
(x,y+1,z,t+1)
(x,y-1,z,t+1)
(x,y,z+1,t+1)
(x,y,z-1,t+1)這六個狀態,所以我們可以想象從(0,0,0,0)擴充套件到末狀態的情形。
這種擴充套件的形式抽象成資料結構就是樹,由(0,0,0,0) 為根節點,在理想狀態下可以生出6個孩子,分別為(x+1,y,z,t+1)
(x-1,y,z,t+1)
(x,y+1,z,t+1)
(x,y-1,z,t+1)
(x,y,z+1,t+1)
(x,y,z-1,t+1),而這6個孩子又有機會擴充套件生出6*6個,如此延續,而我們的任務就是按層次遍歷這棵樹,這樣就可以盡可能早的找到目標狀態。
對於擴充套件,我們需要運用一些技巧來剪支,比如遇到障礙的支路需要刪除,之前訪問的過的位置在後來訪問時必然不可能是最短路徑的組成部分,這也可刪除,這可以用乙個bool型別的陣列來記錄其是否已經進行過
#include #include using namespace std;
bool mark[50][50][50] ;
int maze[50][50][50] ;
struct pos
;queueq ;
int go[3] =
;int bfs(int a , int b ,int c)
} return -1 ;
}int main()
}} //由於q開始不一定為空,所以要置空
while(q.empty() == false) q.pop();
mark[0][0][0] = true ;
pos start ;
start.x = start.y = start.z =start.t = 0 ;
q.push(start);
int ans = bfs(a,b,c);
if(ans <= t) printf("%d\n",ans);
else printf("-1\n");
} return 0 ;
}
大家一定玩過「推箱子」這個經典的遊戲。具體規則就是在乙個n*m的地圖上,有1個玩家、1個箱子、1個目的地以及若干障礙,其餘是空地。玩家可以往上下左右4個方向移動,但是不能移動出地圖或者移動到障礙裡去。如果往這個方向移動推到了箱子,箱子也會按這個方向移動一格,當然,箱子也不能被推出地圖或推到障礙裡。當箱子被推到目的地以後,遊戲目標達成。現在告訴你遊戲開始是初始的地圖布局,請你求出玩家最少需要移動多少步才能夠將遊戲目標達成。
那麼對於推箱子,思考方式也類似,只不過有一點需要注意,由於推箱子裡有兩個重要的元素,人和箱子,所以要mark人和箱子的座標,mark[x1][y1][x2][y2],一開始只mark[x1][y1]了人的座標資訊這樣會導致錯誤。
#include #include using namespace std ;
bool mark[8][8][8][8] ;
char game[8][8];
int go[2] =;
struct pos;
queueq ;
int bfs(int n , int m)
//人沒有接觸到箱子
else}}
return -1 ;}
int main()
//記錄箱子的位置
else if(game[i][j] == '*')}}
//初始狀態設定true
mark[px][py][qx][qy] = true ;
pos start ;
start.x1 = px ;
start.y1 = py ;
start.x2 = qx ;
start.y2 = qy ;
start.t = 0 ;
while(q.empty() == false ) q.pop();
q.push(start);
int ans = bfs(n,m);
cout << ans ;
return 0 ;
}
2017網易遊戲雷火盤古實習生招聘筆試真題
1.給定乙個字串,請你將字串重新編碼,將連續的字元替換成 連續出現的個數 字元 比如字串aaaabccdaa會被編碼成4a1b2c1d2a。include include char s 10004 int main tem s i cot 1 else cot printf d c cot,tem ...
2017網易雷火盤古實習生招聘試題 硬幣反轉
今天聽說cao參加了網易雷火盤古的招聘,做了幾道程式設計題。據他本人的描述,第一道題是這樣的 第一行輸入兩個數字n和m,表示現在有n個硬幣,需要反轉m次。初始所有硬幣都預設為正面,用0表示,反面則用1表示。求經過一系列操作之後的硬幣正反排列。根據cao本人的說法,輸入輸出樣例是這樣的 感覺比較簡單....
2018網易遊戲雷火盤古實習生招聘筆試真題
1.字串編碼 輸入描述 每個測試輸入包含1個測試用例 每個測試用例輸入只有一行字串,字串只包括大寫英文本母,長度不超過10000。輸出描述 輸出編碼後的字串 輸入例子 aaaabccdaa 輸出例子 4a1b2c1d2a 思路分析 這道題好像以前是一家企業的面試題,leetcode easy級別,思...