日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

javafx 推箱子小游戏object类_突破LeetCode Hard模式之《推箱子》

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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算法的題目,雖然比較容易想到,但是實現起來是有一定難度的,主要要解決以下幾個問題:

  • 想到模擬箱子推動的過程,用BFS算法模擬;
  • 知道根據箱子和人的位置來標記已經搜索過的狀態;
  • 兩層BFS的嵌套使用,外層BFS解決箱子搜索的問題,里層BFS解決判斷人是否可達到箱子推動反方向格子的問題;
  • 一些編碼上的技巧,比如通過方向向量,向4個方向搜索等;
  • 題目分享完畢,記得給算法哥點贊、分享、評論、轉發哦!這都是算法哥繼續分享下去的最大鼓勵!

    總結

    以上是生活随笔為你收集整理的javafx 推箱子小游戏object类_突破LeetCode Hard模式之《推箱子》的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。