Backtracing

典型 DFS/遞歸/回溯/深搜題。對於DFS,說白了

  • 什麼時候返回?

  • DFS 就是針對本輪的所有可能解進行逐一嘗試,找到本輪的一個可能解後,這時要調用遞歸,基於本輪的解對下一輪(子問題)進行求解。

    • 如果下一輪(子問題)求解成功,則說明大功告成,及時返回 true,停止之後的嘗試。

    • 否則如果下一輪(子問題)求解失敗,則說明本輪的解不適合子問題,因此,必須換一個本輪的解,然後基於本輪的新解,繼續嘗試子問題。如果已經本輪所有的解都嘗試過了,也都失敗了,說明本問題無解,返回false。

當然在每次嘗試子問題前和如果失敗返回後,都要恢復原來的環境(撤銷動作)。

所以,要想使DFS成功返回,條件就是找到滿足本輪的解和這個解也要滿足下一輪(子問題)。

另外:

  • 每個 backtracking 的題目,最好都有獨立判斷 isValid 的程序,這樣架構清楚。同時,isValid判斷函數在這裏可以稍微研究一下。只要當前要判斷的位置上的數值和本行沒有重複,本列沒有重複,九宮格沒有重複就可以。一旦重複立即返回,減少判斷次數。

  • backtracking的遞歸函數,怎麼能沒有返回值呢?!因爲要判斷遞歸的方案正確與否,所以這裏的遞歸一定是有返回值的(除非是combination那種沒有正確錯誤概念的backtracking)!

  • 可以考慮“先放置,再判斷”的方案。比如這裏,首先判斷當前位置是否爲空,如果爲空,那麼放置一個元素,檢查它是否正確。如果正確,就繼續進行下面的遞歸。當函數返回錯誤之後,將剛剛的數值變爲空,再進行下一次嘗試即可。

  • 所有的方案(k從1到9)完畢之後,應該返回錯誤,這個是不應該被忽略的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章