杭电1728bfs逃离迷宫java实现
Problem Description
給定一個m × n (m行, n列)的迷宮,迷宮中有兩個位置,gloria想從迷宮的一個位置走到另外一個位置,當然迷宮中有些地方是空地,gloria可以穿越,有些地方是障礙,她必須繞行,從迷宮的一個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,gloria不能走到迷宮外面去。令人頭痛的是,gloria是個沒什么方向感的人,因此,她在行走過程中,不能轉太多彎了,否則她會暈倒的。我們假定給定的兩個位置都是空地,初始時,gloria所面向的方向未定,她可以選擇4個方向的任何一個出發,而不算成一次轉彎。gloria能從一個位置走到另外一個位置嗎?
Input
第1行為一個整數t (1 ≤ t ≤ 100),表示測試數據的個數,接下來為t組測試數據,每組測試數據中,
第1行為兩個整數m, n (1 ≤ m, n ≤ 100),分別表示迷宮的行數和列數,接下來m行,每行包括n個字符,其中字符’.‘表示該位置為空地,字符’*'表示該位置為障礙,輸入數據中只有這兩種字符,每組測試數據的最后一行為5個整數k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能轉的彎數,(x1, y1), (x2, y2)表示兩個位置,其中x1,x2對應列,y1, y2對應行。
Output
每組測試數據對應為一行,若gloria能從一個位置走到另外一個位置,輸出“yes”,否則輸出“no”。
Sample Input
2
5 5
…**
*..
…
…
…
1 1 1 1 3
5 5
…
*.*.
…
…
*…
2 1 1 1 3
Sample Output
no
yes
首先論對寬搜的認識,學習數據結構之前,一直看不懂什么是寬搜,當時遇到搜索題很是苦惱,只會用回溯法進行深搜,還是利用到了函數運行的機制(類似遞歸),第一次真正明白寬搜的運行機制是二叉樹的遍歷,有一種用隊列的遍歷方式(二叉樹鏈接)才明白寬搜的運行機制,面對這題,深搜超時,可能有的大神優化能過。但是首先想到的應該是寬搜,核心點是轉彎的次數。
1:剛開始我打算用boolean數組標記走過的位置,用class新類time表示點的轉彎次數,后來錯了。想了一想錯的原因,右下右轉兩次,如果下右右只有一次但是晚走而沒法走,所以這種想法是錯的。
2:用數組標記當前點的最小轉彎,如果新點,入隊。若果比這個點的轉彎次小于等于,也可以入隊。這樣就能保證最終找到最終答案,但是還是不過,超時。至于原因:樓梯模型(要克服樓梯的走樓梯而不直走的問題)
3:最終處理方案:使用優先隊列,(java的需要自己百度學習一下),因為漫天都是C類的代碼,教程,我根本不知道那個是優先隊列。必須用優先隊列優化。后來請教了學長幫我解決。優先隊列讓小節點先 入隊。
wa了28次,第29次終于過了。
代碼如下:
不知道有什么不妥或者不對的地方。請大神更正
總結
以上是生活随笔為你收集整理的杭电1728bfs逃离迷宫java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实现简单的二叉树ADT
- 下一篇: 杭电1010java实现dfs