你的算法不會因爲這樣的情況下工作:
O - - -
X - - X
,因爲你的算法會首先去所有的路權
O 1 2 3
X - - X
和標記回溯時擋住了右側的單元格,所以它永遠不會找到最佳的
O 1 4 5
X 2 3 X
你可以用通用的方式解決這個問題,將其視爲一個圖形問題,並簡單地應用任何最長路徑算法(通常是NP-hard),但我不確定你是否熟悉這種方法。
一個可能更簡單的來看待它的方式是這樣的:
- 跟蹤當前的位置和所有你帶到那裏的步驟。
- 對於每個位置,您最終都會嘗試按順序向右(R),向下(D),向左(L),向上(U)順序進入各個方向。
- 當您嘗試了某個位置的所有方向(即,您嘗試了U)後,通過執行您所做的最後一個步驟的反轉,退一步。
一個例子可能有所幫助。再次考慮同一個例子。我用C代表當前位置,#代表訪問單元。我們跟蹤移動堆棧和回溯情況下的最後一步。
C - - - Stack: []
X - - X Backtracked move: -
步驟正確
# C - - Stack: [R]
X - - X Backtracked move: -
步驟正確
# # C - Stack: [R, R]
X - - X Backtracked move: -
步驟正確
# # # C Stack: [R, R, R]
X - - X Backtracked move: -
嘗試右,下,左,後,發現你被卡住,回溯,即採取正確的反向(le英尺)
# # C - Stack: [R, R]
X - - X Backtracked move: R
最後一次回溯移動是正確的,所以現在嘗試下一步,即,下臺
# # # - Stack: [R, R, D]
X - C X Backtracked move: -
試試吧,試下來,一步離開
# # # - Stack: [R, R, D, L]
X C# X Backtracked move: -
再次卡住了,所以原路返回
# # # - Stack: [R, R, D]
X - C X Backtracked move: L
最後出爾反爾的舉動被留下,所以現在嘗試採取下一步行動,即嘗試。注意我們被卡住了,並且進一步回溯。
快進到第一個有趣的下一步:
# C - - Stack: [R]
X - - X Backtracked move: R
最後一個是正確的,那麼請繼續往下。
# # - - Stack: [R, D]
X C - X Backtracked move: -
你可能已經明白了吧,所以我只是快進一路:
# # # C Stack: [R, D, R, U, R]
X # # X Backtracked move: -
和回溯一路:
C - - - Stack: []
X - - X Backtracked move: R
最後此舉是對,所以試着下,左,上。你完成了。
一路上你跟蹤你見過的最長的路徑,那就是你的答案。
抱歉沒有迴應。我將不得不檢查這一點。正如我在這裏的其他回覆中所說的,我已經改變了我的算法。所以基本上我現在要做的就是遍歷一遍,最終訪問每個單元格,以便找到最長的移動堆棧。一旦我們訪問了每個單元格,我只需循環移動堆棧並根據它移動。 – cloudbells