1. 程式人生 > >演算法 遞歸回溯 八皇后問題

演算法 遞歸回溯 八皇后問題

/* 八皇后問題: 其實就是在全排列的基礎上加了不能在對角線這個條件,第一個程式碼直接用暴力法判斷這個條件,第二個程式碼用回溯法,回溯法減少了很多計算量 */ #include<iostream> #include<cmath> using namespace std; const int Max=10; int n; int count=0; bool Pos[Max]= {false}; int T[Max]; void generateP(int index) {     if(index==n+1)     {         bool flag=true;         for(int i=1; i<=n; i++)         {             for(int j=i+1; j<=n; j++)             {                 if(abs(j-i)==abs(T[i]-T[j]))//相當於在在一個直角三角形中,當該兩者相等時,則角度為45,則為對角線                 {                     flag=false;                     break;                 }

            }             if(flag==false)break ;         }         if(flag)count++;

        return ;     }

    for(int x=1; x<=n; x++)     {         if(Pos[x]==false)         {             Pos[x]=true;             T[index]=x;             generateP(index+1);             Pos[x]=false;         }     }

}

int main() {     cin>>n;     generateP(1);     cout<<count;     return 0; } //第二個改進的程式碼

#include<iostream> #include<cmath> using namespace std; int n; const int Max=10; bool pos[Max]= {false}; int T[Max]; int count=0;

void generateP(int index) {     bool flag=true;     if(index==n+1)//當程式能走到這一步,證明各項條件都滿足了     {         count++;     }

    for(int x=1; x<=n; x++)     {         bool flag=true;         if(pos[x]==false)//當符合基本條件不同行時         {             for(int pre=1;pre<index;pre++)//開始檢驗是否為對角線             {                 if(abs(T[pre]-x)==abs(pre-index))                     {                         flag=false;                         break;                     }             }

                if(flag)                 {                     T[index]=x;                     pos[x]=true;                     generateP(index+1);                     pos[x]=false;                 }         }

    } }

int main() {     cin>>n;     generateP(1);     cout<<count;     return 0; }

//參考資料  《演算法筆記》