javafx 推箱子小游戏object类_突破LeetCode Hard模式之《推箱子》
導讀:算法哥好久沒分享有趣的算法題了,有點寂寞空虛冷,今天看到一道似曾相識的題目,而且難度是hard模式,勾起了算法哥的征服欲。特分享之!
題目描述
「推箱子」是一款風靡全球的益智小游戲,玩家需要將箱子推到倉庫中的目標位置。
游戲地圖用大小為 m * n 的網格 grid 表示,其中每個元素可以是墻、地板或者是箱子。
現在你將作為玩家參與游戲,按規則將箱子 'B' 移動到目標位置 'T' :
玩家用字符 'S' 表示,只要他在地板上,就可以在網格中向上、下、左、右四個方向移動。
地板用字符 '.' 表示,意味著可以自由行走。
墻用字符 '#' 表示,意味著障礙物,不能通行。
箱子僅有一個,用字符 'B' 表示。相應地,網格上有一個目標位置 'T'。
玩家需要站在箱子旁邊,然后沿著箱子的方向進行移動,此時箱子會被移動到相鄰的地板單元格。記作一次「推動」。玩家無法越過箱子。返回將箱子推到目標位置的最小 推動 次數,如果無法做到,請返回 -1。
題目來源:LeetCode 1263
示例一
題目分析
其實這個題目,一看就能想到需要用廣度優先搜索算法(BFS),我們也很自然的會想到,模擬推箱子的過程即可!
過程:
以箱子為起點,嘗試每一步4個方向移動,移動的前提是,人可以達到箱子移動過去的格子的反方向的格子!所以這里還需要判斷一下,人從當前位置是否可以到達那個反方向的格子。至此題目的思路就出來了。
在BFS的時候,我們需要把搜索過的人和箱子的位置做一個標記,防止重復搜索,因為變化位置的只有可能是人的位置,以及箱子的位置,所以我們可以用一個四維數組來標記人和箱子的狀態,BFS過程中,檢查一下人和箱子的位置是不是以前搜索過,搜索過就放棄,反之就繼續搜索!
顯然,搜索的起點是初始狀態下箱子和人的位置,我們標記為(bx,by)和(sx,sy),初始移動次數是0,然后我們從起點出發,遍歷箱子的4個方向,檢查是否可以推過去(推過去的格子是不是墻,人是不是可以到達推過去格子反方向的格子),如果可以,把新的箱子位置和人的位置,以及推動箱子次數,作為一個新的狀態加入到BFS的隊列里,繼續搜索直到走到位置T.
源碼如下:
源碼
復雜度分析
運行時間空間
復雜度,首先我們搜索的時候是從人和箱子的位置來搜索的,箱子的位置有m*n種,人的位置也有m*n種,但是實際在搜索過程中,人永遠在箱子相鄰4個格子,所以人的位置對于每個箱子位置是4個,總的搜索狀態是m*n*4的,其次每次推動過程中有一次判斷人的位置是否可以到達箱子推動方向反方向的格子的判斷,這個步驟是m*n的復雜度,所以總的時間復雜度是O(m*n*m*n)的,擊敗了100%的提交!
總結
這個題目是一個比較經典的BFS算法的題目,雖然比較容易想到,但是實現起來是有一定難度的,主要要解決以下幾個問題:
題目分享完畢,記得給算法哥點贊、分享、評論、轉發哦!這都是算法哥繼續分享下去的最大鼓勵!
總結
以上是生活随笔為你收集整理的javafx 推箱子小游戏object类_突破LeetCode Hard模式之《推箱子》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用php写一个可以抽取随机数的工具一次只
- 下一篇: 谷歌不支持调用摄像头麦克风_谷歌发布安卓