算法之回溯 --回溯算法的思想和實現

回溯算法是一種重要的解決存在多個最優解的算法思想。

      回溯算法從開始結點(根結點)出發,以深度優先的方式搜索整個解空間。這個開始結點就成爲一個活結點,同時也成爲當前的擴展結點。在當前的擴展結點處,搜索向縱深方向移至一個新結點。這個新結點就成爲一個新的活結點,併成爲當前擴展結點。如果在當前的擴展結點處不能再向縱深方向移動,則當前擴展結點就成爲死結點。此時,應往回移動(回溯)至最近的一個活結點處,並使這個活結點成爲當前的擴展結點。回溯法即以這種工作方式遞歸地在解空間中搜索,直至找到所要求的解或解空間中已沒有活結點時爲止。

    回溯算法存在重複子問題,算法複雜度爲o(2^N)

    利用回溯法解決的問題有: 數獨的求解, 八皇后問題,中國象棋走馬的問題等。

  1.     數獨的求解

      數獨的要求是每行數據不重複,每列數據不重複, 每個宮內數據不重複。

      

   

 

 

  2.     八皇后問題

       所謂八皇后問題就是:將八位皇后放在一張8x8的棋盤上,使得每位皇后都無法喫掉別的皇后,(即任意兩個皇后都不在同一條橫線,豎線和斜線上),輸出擺法。

     

 

  3.     象棋馬走日問題

          馬走日字問題,在n*m的棋盤中,馬只能走"日"字。馬從位置(x,y)出發,把棋盤的每一格都走一次且只走一次。找出所有路徑。 這個問題可以用回溯法解,每一步都有八種可能的走法,設馬當前在(x,y)點,則它的可能走到:(x+1,x+2),(x+1,x-2),(x-1,x+2),(x-1,x-2),(x+2,x+1),(x+2,x-1),(x-2,x+1),(x-2,x-1) 。對每一種可能的走法試一遍,如果出界了或者已經走過了,則不用走了。試探一遍後,回溯。

   

 

   

 

      

 

 

 

 

 

 

 

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