ACM第二次練習—1019

題意:在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。

思路:X(j)表示一個解的空間,j表示行數,裏面的值表示可以放置在的列數,抽象約束條件得到能放置一個皇后的約束條件(1)X(i)!=X(k);(2)abs(X(i)-X(k))!=abs(i-k)。應用回溯法,當可以放置皇后時就繼續到下一行,不行的話就返回到第一行,重新檢驗要放的列數,如此反覆,直到將所有解解出。 

 感想:書上的例題。不多說我看懂了。
代碼:
#include<iostream>
#include<cmath>
using namespace std;
int x[11],N,sum;
bool place(int k){ //判斷第K個皇后是否可以加入 
     for(int i=1;i<k;i++){
             if(x[i]==x[k] || abs(k-i)==abs(x[k]-x[i]))
                return false;
     }
     return true ;
}
void backtrack(int k){ //k的初值爲1 
     if(k>N)   //安排完N個皇后後sum++ 
        sum++;
     else{
          for(int i=1;i<=N;i++){  //找第K個皇后的列座標 
                  x[k]=i;  
                  if(place(k)){
                     backtrack(k+1);
                  } 
          }
     }   
}
int main(){
    int ans[11];
    for(N=1;N<=10;N++){
        sum=0;
        backtrack(1);
        ans[N]=sum;
    }
    while(scanf("%d",&N)!=EOF && N){
         printf("%d\n",ans[N]);
    }
    return 0;
}

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