題意:在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。
思路:X(j)表示一個解的空間,j表示行數,裏面的值表示可以放置在的列數,抽象約束條件得到能放置一個皇后的約束條件(1)X(i)!=X(k);(2)abs(X(i)-X(k))!=abs(i-k)。應用回溯法,當可以放置皇后時就繼續到下一行,不行的話就返回到第一行,重新檢驗要放的列數,如此反覆,直到將所有解解出。
#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;
}