N皇后问题
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N<=12,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 92 10
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <cstdlib> 3 4 int x[100],sum; 5 bool place(int k)//考察皇后k放置在x[k]列是否发生冲突 6 { 7 for(int i=1; i<k; i++) 8 if(x[k]==x[i] || abs(k-i)==abs(x[k]-x[i])) 9 return false; 10 return true; 11 } 12 13 void DFS(int n) 14 { 15 int i,k; 16 for(i=1; i<=n; i++) x[i]=0; 17 k=1; 18 while(k>=1) 19 { 20 x[k]=x[k]+1; //在下一列放置第k个皇后 21 while(x[k]<=n && !place(k)) x[k]=x[k]+1;//搜索下一列 22 if(x[k]<=n && k==n) sum++; //皇后所放位置 23 else if(x[k]<=n && k<n) k=k+1;//放置下一个皇后 24 else 25 { 26 x[k]=0;//重置x[k],回溯 27 k=k-1; 28 } 29 } 30 } 31 32 int main() 33 { 34 int n; 35 while(scanf("%d",&n),n) 36 { 37 sum=0; 38 DFS(n); 39 printf("%d\n",sum); 40 } 41 return 0; 42 }