Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果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<stdlib.h>
3 #include<math.h>
4 int x[11], N, sum;
5 bool judge( int k )//判断是否可以加入
6 {
7 for( int i = 1; i < k; i++ )
8 {
9 if( x[i] == x[k] || abs(k-i) == abs(x[k] - x[i]) )
10 return false;
11 }
12 return true;
13 }
14
15 void dfs( int k )//回溯,K初值为1
16 {
17 if( k > N )//安排完后,sum++
18 sum++;
19 else
20 {
21 for( int i = 1; i <= N; i++ )//第K个皇后的列坐标
22 {
23 x[k] = i;
24 if( judge( k ) )
25 {
26 dfs( k+1 );
27 }
28 }
29 }
30 }
31
32 int main()
33 {
34 int ans[11];
35 for( N = 1; N <= 10; N++ )
36 {
37 sum = 0;
38 dfs(1);
39 ans[N] = sum;
40 }//预处理
41 while( scanf( "%d", &N )!=EOF &&N )
42 {
43 printf( "%d\n", ans[N] );
44 }
45 return 0;
46 }