N皇后问题

Problem Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

Input

共有若干行,每行一个正整数N<=12,表示棋盘和皇后的数量;如果N=0,表示结束。

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

Sample Input

1
8
5
0

Sample Output

1
92
10
 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 }
View Code

 

posted @ 2013-08-07 16:46  1002liu  阅读(163)  评论(0编辑  收藏  举报