手撕八皇后問題,用回溯法哦(深度優先法)

問題描述:

在一個8*8的棋盤上,有8個皇后放置在棋盤上,兩兩不能對衝,即行 ,列,斜 只能放置一個皇后。

比如下圖,第一行的皇后行 ,列,斜 只能放置一個皇后。

 

解答這種題,首先分析算法流程

這裏有一個點特別注意,就是佔位標誌的判斷,首先是列佔位,這個直接標誌就行了

但是斜線角怎麼判斷?

通常上對角,行號減去列號都是相等的,比如拿f[0][0] 來說,它的上對角是哪些呢?

行號0 -列號0 =0 ,它的對角行號減去列號都是0,我們可以用一個數組存儲d1[0] = 0 ,表示佔用,數組的下標是行號減去列號相減的結果。

注意:爲了避免數組下標出現負號,所以相減結果統一加7(爲什麼是7,因爲棋盤上,最小的負數是-7)

 

接下來下對角,行號加列號都是相等的,其他跟上面同理。但用另外的一個數組d2存儲,方便判斷

接下來要分析程序思想

代碼:

      //八皇后問題
      var place = [] //存儲皇后放置的列
      var flag = [1,1,1,1,1,1,1,1] //標誌數組,表示第col列的皇后是否被佔位。0表示佔位,1表示沒有
      var d1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] //表示第col列的皇后的上對角線的標誌位是否被佔用
      var d2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] //表示第col列的皇后的下對角線的標誌位是否被佔用
      function queen(n){
          for(var col =0 ;col <8;col++){
            if(flag[col] && d1[n-col+7] &&d2[n+col]){
              place[n] = col
              flag[col] = 0
              d1[n-col+7] = 0
              d2[n+col]  = 0
              if(n<7){
                queen(n+1)  //小於7,進行下一行
              }
              else{
                console.log("八皇后結果",place)
              }
              //找到一個解後,回溯上一個,看有沒有其他解,所以上一個的佔位標誌要清除
              flag[col] = 1
              d1[n-col+7] = 1
              d2[n+col]  = 1
            }
          }
      }
      queen(0)

 

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