n皇后 回溯

回溯思想

回溯算法實際上一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術爲回溯法,而滿足回溯條件的某個狀態的點稱爲“回溯點”。許多複雜的,規模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。
我個人的理解就是不斷地去嘗試,滿足條件便一直深入下去嘗試,直到出現不滿足的情況時或則得到答案時便返回上一層

n皇后

n皇后問題就是在n*n的棋盤上放置n個皇后,使得n個皇后兩兩之間不能進行攻擊(即每兩個皇后不可以在同一行,同一列,在同一斜線上(斜率爲1的斜線))

問題解析

n皇后問題就是依次將每個皇后放在棋盤的某個位置,每次放置時要判斷這個位置是否可以放置皇后,判斷方式就是對已放置的皇后的座標進行對比並且驗證將要放置的皇后是否滿足互不攻擊的條件。

代碼

int a[100] 下標代表行,存儲着列號

bool pd(int row,int col)
{
   for(int i=0;i<row;i++)
   {
       if(a[i]==col||abs(i-row)==abs(col-a[i]))    //判斷該位置是否可以放置皇后
           return false;
   }
   return true;
}

在回溯的過程我使用的是遞歸的方式

void getResult(int row)
{
    if(row==n)      //說明前n-1行都放置了皇后,就確定了一個方案
    {
         all++;
    }
    else{
      for(int i=0;i<n;i++)       
      {
          if(pd(row,i))          //判斷成功說明該位置可以放置皇后,並且進行下一行的判斷

          {
              a[row]=i;
              getResult(row+1);
          }
      }
    }
}

大致的思想就是一行一行進行放置皇后,這樣可以保證每個皇后都不在同一個行,這樣在判斷放置的位置是否合理時,只需判斷是否與已放置的皇后是否在一列或者在一斜線。這樣一行行的判斷下去,直到所有的可能都被遍歷完,就得到了結果。

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